android - how - fragment preferencefragment



O PreferenceFragment foi intencionalmente excluído do pacote de compatibilidade? (6)

Eu estou olhando para escrever preferências que podem ser aplicadas a dispositivos 3.0 e pré-3.0. Descobrindo que PreferenceActivity contém métodos depreciados (embora estes sejam usados ​​no código de exemplo acompanhante), eu olhei para PreferenceFragement e o pacote de compatibilidade para resolver meus problemas.

Parece, no entanto, que PreferenceFragment não está no pacote de compatibilidade. Alguém pode me dizer se isso foi intencional? Em caso afirmativo, posso segmentar facilmente um intervalo de dispositivos (ou seja, <3,0 e> = 3,0) ou terei que saltar através de aros? Se não foi intencionalmente excluído, podemos esperar uma nova versão do pacote de compatibilidade? Ou há outra solução alternativa que seja segura de usar?

Felicidades

James

https://ffff65535.com


Descobrir que PreferenceActivity contém métodos obsoletos (embora eles sejam usados ​​no código de amostra acompanhante)

Os métodos obsoletos foram reprovados a partir do Android 3.0. Eles estão perfeitamente bem em todas as versões do Android, mas a direção é usar PreferenceFragment no Android 3.0 e superior.

Alguém pode me dizer se isso foi intencional?

Meu palpite é que é uma questão de tempo de engenharia, mas isso é apenas um palpite.

Em caso afirmativo, posso segmentar facilmente um intervalo de dispositivos (ou seja, <3,0 e> = 3,0) ou terei que saltar através de aros?

Eu considero que isso seja feito "facilmente". Ter duas implementações PreferenceActivity separadas, uma usando cabeçalhos de preferência e PreferenceFragments , a outra usando a abordagem original. Escolha o caminho certo no ponto que você precisa (por exemplo, quando o usuário clica no item de menu de opções). Aqui está um exemplo de projeto demonstrando isso. Ou, tenha uma única PreferenceActivity que manipule os dois casos, como neste projeto de amostra .

Se não foi intencionalmente excluído, podemos esperar uma nova versão do pacote de compatibilidade?

Você descobrirá quando o resto de nós descobrir, o que é dizer, se e quando é enviado.

Ou há outra solução alternativa que seja segura de usar?

Veja acima.


A implicação sutil da resposta do @CommonsWare é que - seu aplicativo deve escolher entre a API de compatibilidade ou a API de fragmento integrada (desde o SDK 11 ou mais). Na verdade, é o que a recomendação "fácil" fez. Em outras palavras, se você deseja usar PreferenceFragment, seu aplicativo precisa usar a API de fragmento integrada e lidar com os métodos obsoletos em PreferenceActivity. Por outro lado, se é importante que seu aplicativo use o compat. API você será confrontado com não ter uma classe PreferenceFragment. Assim, os dispositivos de segmentação não são um problema, mas o salto de aro acontece quando você precisa escolher uma ou outra API e, assim, enviar seu design para soluções imprevistas. Eu preciso do compat. API, então vou criar minha própria classe PreferenceFragment e ver como isso funciona. Na pior das hipóteses, vou apenas criar um layout normal (fragment) e vincular os componentes da view às sharedprefs manualmente ... ugh.

EDIT: depois de tentar e olhar para o código em http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/preference/PreferenceFragment.java?av=h - criar o meu próprio PreferenceFragment não vai acontecer. Parece que o uso liberal de package-private no PreferenceManager em vez de 'protected' é o principal bloqueador. Realmente não parece haver alguma segurança ou uma boa motivação para ter feito isso e não é ótimo para testes unitários, mas tudo bem ... menos digitação, eu acho ...

EDITAR v2: Na verdade, aconteceu e funcionou. Foi definitivamente uma dor de cabeça para fazer o código funcionar com o JAR da API de compatibilidade. Eu tive que copiar cerca de 70% do pacote com.android.preference do SDK para o meu aplicativo e, em seguida, lutar com código Java tipicamente medíocre no Android. Eu usei v14 do SDK. Teria sido muito mais fácil para um engenheiro da Goog fazer o que eu fiz, ao contrário do que ouvi alguns engenheiros líderes do Android dizerem sobre esse assunto.

BTW - eu disse "dispositivos de segmentação não é um problema"? É totalmente ... se você usar com.android.preference, você não será capaz de trocar com a Compatibility API sem grandes refatorações. Log divertido!


Com base na resposta do CommonsWare e nas observações do Tenacious, eu criei uma única solução de classe descendente capaz de segmentar todas as versões atuais da API do Android com o mínimo de confusão e sem duplicação de código ou recursos. Por favor, veja a minha resposta para a questão relacionada aqui: PreferenceActivity Android 4.0 e anterior

ou no meu blog: http://www.blackmoonit.com/2012/07/all_api_prefsactivity/

Testado em dois tablets rodando 4.0.3 e 4.0.4, bem como um telefone rodando 4.0.4 e 2.3.3 e também um emulador rodando 1.6.


Em agosto de 2015, o Google lançou a nova Preference Support Library v7 .

Agora você pode usar o PreferenceFragmentCompat com qualquer Activity ou AppCompatActivity

public static class PrefsFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
}

Você precisa definir o preferenceTheme no seu tema:

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
  ...
  <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

Dessa forma, você pode personalizar o preferenceTheme para estilizar os layouts usados ​​para cada tipo de preferência sem afetar outras partes da sua atividade.


Meu destino de aplicativo é a API +14, mas devido ao uso da biblioteca de suporte para navegação sofisticada, não pude usar o android.app.Fragment e tive que usar o android.support.v4.app.Fragment , mas também precisava ter PreferenceFragment no lugar sem grandes alterações no código por trás.

Então, minha correção fácil para ter dois mundos de biblioteca de suporte e PreferenceFragment :

private android.support.v4.app.Fragment fragment;
private android.app.Fragment nativeFragment = null;

private void selectItem(int position) {
    fragment = null;
    boolean useNativeFragment = false;
    switch (position) {
    case 0:
        fragment = new SampleSupprtFragment1();
        break;
    case 1:
        fragment = new SampleSupprtFragment2();
        break;
    case 2:
        nativeFragment = new SettingsFragment();
        useNativeFragment = true;
        break;
    }
    if (useNativeFragment) {
        android.app.FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
            .replace(R.id.content_frame, nativeFragment).commit();
    } else {
        if (nativeFragment != null) {
            getFragmentManager().beginTransaction().remove(nativeFragment)
                .commit();
            nativeFragment = null;
        }
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
            .replace(R.id.content_frame, fragment).commit();
    }
}





android-3.0-honeycomb