development

PreferenceActivity에서 "addPreferencesFromResource"대신 무엇을 사용해야합니까?

big-blog 2020. 2. 29. 15:24
반응형

PreferenceActivity에서 "addPreferencesFromResource"대신 무엇을 사용해야합니까?


방금 안드로이드의 문서 ( Reference Entry ) 에서 메소드 addPreferencesFromResource(int preferencesResId)더 이상 사용되지 않는 것으로 나타났습니다 .

불행하게도, 방법의 설명에 다른 방법이 제공되지 않습니다.

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


API 레벨 11에서 선호하는 접근 방식은 PreferenceFragment 객체를 인스턴스화 하여 리소스 파일에서 환경 설정을로드 하는 것이므로 메소드 설명에 대체 방법이 제공되지 않습니다 . 여기에서 샘플 코드를보십시오 : PreferenceActivity


위의 정답에 더 많은 정보를 추가하기 위해 Android에서 예제를 읽은 후 환경 설정 활동을 환경 설정 조각으로 쉽게 변환 할 수 있음을 알았습니다. 다음 활동이있는 경우 :

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

다음과 같이 내부 조각 클래스를 만들고 조각으로 이동 한 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);
        }
    }
}

프래그먼트에서 더 복잡한 환경 설정을 만드는 데 다른 미묘한 점이있을 수 있습니다. 그렇다면 누군가가 여기에 메모하기를 바랍니다.


@Garret Wilson 정말 감사합니다! 안드로이드 코딩에 대한 멍청한 듯이, 나는 많은 시간 동안 기본 설정 비 호환성 문제에 갇혀 있었고, 이전 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)에서 성공적으로 테스트되었습니다.

왜 내 코드가 너무 엉망인 것입니까?

나는 안드로이드 코딩의 멍청한 놈이며, 가장 큰 자바 팬이 아닙니다.

더 이상 사용되지 않는 경고를 피하고 Eclipse가 컴파일하도록 강제하기 위해 주석에 의존해야했지만 클래스 또는 메소드에만 영향을 미치는 것으로 보이므로 코드를 두 가지 새로운 메소드로 옮겨야했습니다.

새 PreferenceActivity에 대한 클래스를 복사하여 붙여 넣을 때마다 xml 리소스 ID를 두 번 쓰지 않아도 되므로이 값을 저장하기 위해 새 변수를 만들었습니다.

나는 이것이 다른 누군가에게 유용하기를 바랍니다.

추신 : 저의 의견에 대해 죄송하지만, 새로 와서 그러한 장애를 발견하면 도움을 드릴 수 없습니다.


내 접근 방식은 Garret Wilson과 매우 가깝습니다 (감사합니다.

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

나는 방금 내 솔루션이 Kevin Remo 의 솔루션에 더 가깝다는 것을 알았습니다 . "expection"antipattern 에 의존하지 않기 때문에 단순한 비트 클리너 입니다.

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();
    }
}

"실제"(보다 복잡한) 예제는 NusicPreferencesActivityNusicPreferencesFragment 를 참조하십시오 .


예외 대신 다음을 사용하십시오.

if (Build.VERSION.SDK_INT >= 11)

사용

@SuppressLint("NewApi")

경고를 억제합니다.


a PreferenceActivity사용하여 환경 설정을 직접로드 하는 대신 환경 설정 AppCompatActivity을로드하는 a PreferenceFragmentCompat를로드 하는 동등한 기능을 사용 하십시오. 지원 라이브러리 (현재 Android Jetpack)의 일부이며 API 14와의 호환성을 다시 제공합니다.

build.gradle에서 환경 설정 지원 라이브러리에 대한 종속성을 추가 하십시오 .

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

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

활동의 경우 새 활동 클래스를 작성하십시오. 머티리얼 테마를 사용하는 경우을 확장해야 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 개발자 문서 를 참조하십시오 PreferenceFragmentCompat.

참고 : https://stackoverflow.com/questions/6822319/resource-in-a-preferenceactivity의 https://stackoverflow.com/questions/6822319/what-to-use-instead-of-addpreferences



반응형