programing

환경설정 활동에서 "자원에서 환경설정 추가" 대신 사용할 항목은 무엇입니까?

i4 2023. 8. 9. 20:30
반응형

환경설정 활동에서 "자원에서 환경설정 추가" 대신 사용할 항목은 무엇입니까?

방금 그 방법이addPreferencesFromResource(int preferencesResId)는 Android 설명서(Reference Entry)에서 더 이상 사용되지 않는 것으로 표시되어 있습니다.

유감스럽게도 방법 설명에 다른 방법이 제공되지 않습니다.

PreferenceScreen.xml을 일치하는 PreferenceActivity에 연결하려면 어떤 방법을 대신 사용해야 합니까?

선호하는 접근 방식(API 레벨 11 기준)은 리소스 파일에서 기본 설정을 로드하기 위해 기본 설정 조각 개체를 인스턴스화하는 것이기 때문에 메소드 설명에 다른 방법이 제공되지 않습니다.여기의 샘플 코드: 기본 설정 활동을 참조하십시오.

위의 정답에 더 많은 정보를 추가하기 위해 Android-er의 예제를 읽은 후 선호 활동을 선호 단편으로 쉽게 변환할 수 있다는 것을 알게 되었습니다.다음 활동이 있는 경우:

public class MyPreferenceActivity extends PreferenceActivity
{
    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.my_preference_screen);
    }
}

변경해야 하는 유일한 변경 사항은 내부 fragment 클래스를 만들고 다음을 이동하는 것입니다.addPreferencesFromResources()다음과 같이 작업에서 조각을 호출합니다.

public class MyPreferenceActivity extends PreferenceActivity
{
    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
    }

    public static class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.my_preference_screen);
        }
    }
}

단편적인 부분에서 더 복잡한 선호를 만드는 것에는 다른 미묘한 점이 있을 수 있습니다. 그렇다면 누군가 여기에 그것들을 적어두었으면 합니다.

@게럿 윌슨 정말 감사합니다!안드로이드 코딩의 초보자로서, 저는 몇 시간 동안 기본 설정 비호환성 문제에 빠져 있었는데, 오래된 API가 지원하지 않는 새로운 방법/접근법을 사용하지 않는 것이 너무 실망스러워서 앱이 다양한 장치에서 작동할 수 있도록 모든 종류의 해결 방법에 의존해야 했습니다.정말 답답합니다!

당신의 수업은 훌륭합니다. 왜냐하면 그것은 당신이 이전과 같은 방식으로 새로운 API에서 계속 일할 수 있게 해주지만, 그것은 이전과 호환되지 않기 때문입니다.다양한 장치에 접근하려고 노력하고 있기 때문에 API 11 이전 장치와 최신 API에서 작동하도록 약간 조정했습니다.

import android.annotation.TargetApi;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;

public class MyPrefsActivity extends PreferenceActivity
{
    private static int prefs=R.xml.myprefs;

    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        try {
            getClass().getMethod("getFragmentManager");
            AddResourceApi11AndGreater();
        } catch (NoSuchMethodException e) { //Api < 11
            AddResourceApiLessThan11();
        }
    }

    @SuppressWarnings("deprecation")
    protected void AddResourceApiLessThan11()
    {
        addPreferencesFromResource(prefs);
    }

    @TargetApi(11)
    protected void AddResourceApi11AndGreater()
    {
        getFragmentManager().beginTransaction().replace(android.R.id.content,
                new PF()).commit();
    }

    @TargetApi(11)
    public static class PF extends PreferenceFragment
    {       
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(MyPrefsActivity.prefs); //outer class
            // private members seem to be visible for inner class, and
            // making it static made things so much easier
        }
    }
}

두 개의 에뮬레이터(2.2 및 4.2)에서 테스트를 거쳤으며 성공적이었습니다.

내 코드가 왜 그렇게 형편없어 보이는지:

저는 안드로이드 코딩의 초보자이고, 자바 팬은 아닙니다.

더 이상 사용되지 않는 경고를 피하고 이클립스가 컴파일할 수 있도록 하기 위해 주석에 의존해야 했지만, 이것들은 클래스나 메서드에만 영향을 미치는 것으로 보여 이를 활용하기 위해 코드를 두 개의 새로운 방법으로 이동해야 했습니다.

새 Preference Activity를 위해 클래스를 복사하고 붙여넣을 때마다 xml 리소스 ID를 두 번 작성해야 하는 것을 원하지 않으므로 이 값을 저장할 새 변수를 만들었습니다.

저는 이것이 다른 사람에게 유용하기를 바랍니다.

추신: 제 의견은 죄송합니다만, 새로 와서 그런 장애를 발견하면, 좌절하지 않을 수 없습니다!

제 접근 방식은 개럿 윌슨의 접근 방식과 매우 유사합니다(감사합니다, 저는 당신을 뽑았습니다;).

또한 Android < 3과의 하위 호환성을 제공합니다.

저는 제 솔루션이 케빈 레모의 솔루션에 훨씬 더 가깝다는 것을 깨달았습니다.("기대" 반대 패턴에 의존하지 않기 때문에) 조금 더 깨끗할 뿐입니다.

public class MyPreferenceActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
            onCreatePreferenceActivity();
        } else {
            onCreatePreferenceFragment();
        }
    }

    /**
     * Wraps legacy {@link #onCreate(Bundle)} code for Android < 3 (i.e. API lvl
     * < 11).
     */
    @SuppressWarnings("deprecation")
    private void onCreatePreferenceActivity() {
        addPreferencesFromResource(R.xml.preferences);
    }

    /**
     * Wraps {@link #onCreate(Bundle)} code for Android >= 3 (i.e. API lvl >=
     * 11).
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void onCreatePreferenceFragment() {
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new MyPreferenceFragment ())
                .commit();
    }
}

"실제"(그러나 더 복잡한) 예는 Nusic Preferences Activity 및 Nusic Preferences Fragment를 참조하십시오.

예외 대신 다음을 사용합니다.

if (Build.VERSION.SDK_INT >= 11)

및 사용

@SuppressLint("NewApi")

경고를 표시하지 않습니다.

를사는신대를 사용하는 에.PreferenceActivity을▁an다▁to를 합니다.AppCompatActivity 는를로는동것등한하드또▁a것▁that를 로드하는 한 것.PreferenceFragmentCompat기본 설정을 로드합니다.지원 라이브러리(현재 Android Jetpack)의 일부이며 API 14와 호환됩니다.

의 신의에서.build.gradle기본 설정 지원 라이브러리에 대한 종속성 추가:

dependencies {
    // ...
    implementation "androidx.preference:preference:1.0.0-alpha1"
}

참고: 기본 설정 XML이 이미 생성되어 있다고 가정합니다.

활동에 대해 새 활동 클래스를 만듭니다.테마를 때는 ▁an합▁extend다▁if니,▁you▁themes▁should야확을 확장해야 합니다.AppCompatActivity하지만 유연하게 대처할 수 있습니다.

public class MyPreferencesActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_preferences_activity)
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_container, MyPreferencesFragment())
                    .commitNow()
        }
    }
}

이제 중요한 부분은 XML에서 기본 설정을 로드하는 조각을 만드는 것입니다.

public class MyPreferencesFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.my_preferences_fragment); // Your preferences fragment
    }
}

자세한 내용은 Android Developers의 다음 문서를 참조하십시오.PreferenceFragmentCompat.

언급URL : https://stackoverflow.com/questions/6822319/what-to-use-instead-of-addpreferencesfromresource-in-a-preferenceactivity

반응형