Personalizar as configurações   Parte do Android Jetpack.

Este tópico descreve como personalizar Preferences na sua hierarquia.

Como encontrar preferências

Para acessar uma Preference individual, por exemplo, ao consultar ou definir um valor de Preference, use PreferenceFragmentCompat.findPreference(). Esse método pesquisa toda a hierarquia em busca de uma Preference com a chave fornecida.

Por exemplo, considerando EditTextPreference com uma chave de "assinatura":

<EditTextPreference
        app:key="signature"
        app:title="Your signature"/>

Podemos recuperar essa Preference usando o seguinte código:

Kotlin

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource(R.xml.preferences, rootKey)
    val signaturePreference: EditTextPreference? = findPreference("signature")
    // do something with this preference
}

Java

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.preferences, rootKey);
    EditTextPreference signaturePreference = findPreference("signature");
    // do something with this preference
}

Controlar a visibilidade das preferências

Você pode controlar quais Preferences ficam visíveis para o usuário quando ele navega até uma tela de configurações. Por exemplo, se uma determinada Preference for significativa somente quando um recurso correspondente estiver ativado, convém ocultar essa Preference quando o recurso estiver desativado.

Para mostrar um Preference somente quando uma condição for atendida, primeiro defina a visibilidade da Preference como falsa no XML, conforme mostrado no exemplo abaixo:

<EditTextPreference
        app:key="signature"
        app:title="Your signature"
        app:isPreferenceVisible="false"/>

Em seguida, em onCreatePreferences(), mostre o Preference quando a condição correspondente for atendida:

Kotlin

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource(R.xml.preferences, rootKey)
    if(/*some feature*/) {
        val signaturePreference: EditTextPreference? = findPreference("signature")
        signaturePreference?.isVisible = true
    }
}

Java

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.preferences, rootKey);
    if(/*some feature*/) {
        EditTextPreference signaturePreference = findPreference("signature");
        if (signaturePreference != null) {
            signaturePreference.setVisible(true);
        }
    }
}

Atualizar resumos de forma dinâmica

Uma Preference que mantém dados precisa exibir o valor atual no resumo para ajudar o usuário a entender melhor o estado atual da Preference. Por exemplo, um EditTextPreference deve mostrar o valor de texto salvo no momento, e um ListPreference deve mostrar a entrada da lista selecionada no momento. Talvez você também tenha Preferences que precisem atualizar o resumo correspondente com base no estado interno ou externo do app, por exemplo, uma Preference que exibe um número de versão. Isso pode ser feito usando um SummaryProvider.

Usar um SimpleSummaryProvider

ListPreference e EditTextPreference incluem implementações simples de SummaryProvider que exibem automaticamente o valor salvo de Preference como o resumo. Se nenhum valor tiver sido salvo, "Não definido" será exibido.

É possível ativar essas implementações a partir do XML, definindo app:useSimpleSummaryProvider="true".

Como alternativa, no código, é possível usar ListPreference.SimpleSummaryProvider.getInstance() e EditTextPreference.SimpleSummaryProvider.getInstance() para acessar a instância simples de SummaryProvider e, em seguida, defini-la no Preference, conforme mostrado no exemplo a seguir:

Kotlin

listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()

Java

listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());

Usar um SummaryProvider personalizado

Você pode criar seu próprio SummaryProvider e substituir provideSummary() para personalizar o resumo sempre que ele for solicitado pela Preference. Por exemplo, o EditTextPreference abaixo exibe o comprimento do valor salvo como resumo:

Como exemplo, considere o seguinte EditTextPreference:

<EditTextPreference
        app:key="counting"
        app:title="Counting preference"/>

Em onCreatePreferences(), crie um novo SummaryProvider e modifique provideSummary() para retornar o resumo que será exibido:

Kotlin

val countingPreference: EditTextPreference? = findPreference("counting")

countingPreference?.summaryProvider = SummaryProvider<EditTextPreference> { preference ->
    val text = preference.text
    if (TextUtils.isEmpty(text)) {
        "Not set"
    } else {
        "Length of saved value: " + text.length
    }
}

Java

EditTextPreference countingPreference = findPreference("counting");

if (countingPreference != null) {
    countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() {
        @Override
        public CharSequence provideSummary(EditTextPreference preference) {
            String text = preference.getText();
            if (TextUtils.isEmpty(text)){
                return "Not set";
            }
            return "Length of saved value: " + text.length();
        }
    });
}

O resumo de Preference agora exibe o comprimento do valor salvo ou "Não definido", quando nenhum valor foi salvo.

Personalizar uma caixa de diálogo EditTextPreference

Em uma caixa de diálogo EditTextPreference, é possível personalizar o comportamento do campo de texto anexando um OnBindEditTextListener. Esse listener é invocado quando a caixa de diálogo é mostrada ao usuário.

Como exemplo, você pode personalizar uma caixa de diálogo para aceitar apenas números. Primeiro, crie a EditTextPreference:

<EditTextPreference
        app:key="number"
        app:title="Numbers only preference"/>

Em seguida, em onCreatePreferences(), crie um novo OnBindEditTextListener e substitua onBindEditText() para personalizar o EditText quando ele for exibido para o usuário.

Kotlin

val numberPreference: EditTextPreference? = findPreference("number")

numberPreference?.setOnBindEditTextListener { editText ->
    editText.inputType = InputType.TYPE_CLASS_NUMBER
}

Java

EditTextPreference numberPreference = findPreference("number");

if (numberPreference != null) {
    numberPreference.setOnBindEditTextListener(
            new EditTextPreference.OnBindEditTextListener() {
                @Override
                public void onBindEditText(@NonNull EditText editText) {
                    editText.setInputType(InputType.TYPE_CLASS_NUMBER);
                }
            });
}

Agora, quando a caixa de diálogo é exibida para o usuário, o teclado é aberto apenas no modo numérico, para que o usuário possa inserir somente números no EditText.

Ações de preferência

Uma Preference pode ter uma ação específica quando tocada. Por exemplo, uma Preference pode atuar como um link para uma parte separada do seu app. Para adicionar uma ação a uma Preference, defina uma Intent na Preference diretamente ou um OnPreferenceClickListener para uma lógica mais específica.

Definir uma intent

É possível definir uma Intent em uma Preference para iniciar uma nova Activity, ou um novo Fragment ou app separados sempre que a Preference for tocada. Isso é igual a usar Context.startActivity() com uma determinada Intent.

Você pode definir uma Intent em XML usando uma tag <intent>. O exemplo abaixo define uma Intent que inicia uma Activity:

<Preference
        app:key=”activity”
        app:title="Launch activity">
    <intent
            android:targetPackage="com.example"
            android:targetClass="com.example.ExampleActivity"/>
</Preference>

Como alternativa, use setIntent() diretamente em uma Preference, conforme mostrado abaixo:

Kotlin

val intent = Intent(context, ExampleActivity::class.java)
activityPreference.setIntent(intent)

Java

Intent intent = new Intent(getContext(), ExampleActivity.class);
activityPreference.setIntent(intent);

Você também pode incluir extras com uma Intent via XML:

<Preference
        app:key=”activity”
        app:title="Launch activity">
    <intent
            android:targetPackage="com.example"
            android:targetClass="com.example.ExampleActivity">
        <extra
                android:name="example_key"
                android:value="example_value"/>
    </intent>
</Preference>

Veja um exemplo de uma Preference com uma Intent que inicia uma página da Web:

<Preference
        app:key=”webpage”
        app:title="View webpage">
    <intent
            android:action="android.intent.action.VIEW"
            android:data="http://www.google.com" />
</Preference>

Kotlin

val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("http://www.google.com")
webpagePreference.setIntent(intent)

Java

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
webpagePreference.setIntent(intent);

OnPreferenceClickListener

É possível definir um OnPreferenceClickListener em uma Preference, que adiciona um callback a onPreferenceClick() quando a Preference é tocada. Por exemplo, você poderá usar o listener para navegar até outro Fragment ou Activity, se tiver uma lógica mais complexa para lidar com a navegação.

Para definir um OnPreferenceClickListener, use um código semelhante ao seguinte:

Kotlin

onClickPreference.setOnPreferenceClickListener({
    // do something
    true
})

Java

onClickPreference.setOnPreferenceClickListener(preference -> {
    // do something
    return true;
});