Ayarlarınızı özelleştirme Android Jetpack'in bir parçasıdır.

Bu dokümanda, projenizin nasıl özelleştirileceği ve Hiyerarşinizde Preference nesne var.

Tercihleri bulma

Tek bir Preference hesabına erişmek için (örneğin, bir Preference değeri, kullanım PreferenceFragmentCompat.findPreference() Bu yöntem, hiyerarşinin tamamında verilen anahtara sahip bir Preference için arama yapar.

Örneğin, EditTextPreference anahtarı "signature" için aşağıdaki işlemleri yapın:

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

Aşağıdaki kodu kullanarak bu Preference öğesini alın:

KotlinJava
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource
(R.xml.preferences, rootKey)
   
val signaturePreference: EditTextPreference? = findPreference("signature")
   
// Do something with this preference.
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource
(R.xml.preferences, rootKey);
   
EditTextPreference signaturePreference = findPreference("signature");
   
// Do something with this preference.
}

Tercih görünürlüğünü kontrol et

Kullanıcı tarafından görülebilecek Preference nesneleri kontrol edebilirsiniz. bir ayarlar ekranına gidin. Örneğin, belirli bir Preference yalnızca karşılık gelen özellik etkinleştirildiğinde anlam ifade etmezse, bu noktaları gizlemek Preference.

Yalnızca bir koşul karşılandığında Preference gösterilmesi için önce Preference özelliğini ayarlayın aşağıdaki örnekte gösterildiği gibi XML'de false (yanlış) olarak ayarlayın:

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

onCreatePreferences() içinde, Preference karşılık gelen koşul karşılanır:

KotlinJava
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource
(R.xml.preferences, rootKey)
   
if(/*some feature*/) {
       
val signaturePreference: EditTextPreference? = findPreference("signature")
        signaturePreference
?.isVisible = true
   
}
}
@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);
       
}
   
}
}

Özetleri dinamik olarak güncelleme

Verileri saklayan bir Preference, geçerli değeri sayfanın mevcut durumunu daha iyi anlamasına yardımcı olacak bir özet Preference Örneğin, EditTextPreference, kayıtlı metni göstermelidir değeri ve ListPreference seçili liste girişini göstermelidir. Ayrıca özetlerini dahili veya harici yapılandırmaya göre güncellemesi gereken Preference nesne harici uygulama durumu (örneğin, bir sürümü gösteren Preference) sayı. Bunu yapmak için SummaryProvider.

SimpleSummaryProvider kullanma

ListPreference ve EditTextPreference otomatik olarak görüntüleyen basit SummaryProvider uygulamalarını içerme özet olarak Preference değeri kaydedildi. Hiçbir değer kaydedilmezse "Not" ayar."

Bu uygulamaları XML'den etkinleştirmek için app:useSimpleSummaryProvider="true"

Alternatif olarak, kodda ListPreference.SimpleSummaryProvider.getInstance() ve EditTextPreference.SimpleSummaryProvider.getInstance() basit SummaryProvider örneğini alıp Preference, aşağıdaki örnekte gösterildiği gibi:

KotlinJava
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference
.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
editTextPreference
.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());

Özel bir SummaryProvider kullanma

Kendi SummaryProvider öğenizi oluşturup geçersiz kılabilirsiniz provideSummary() özelleştirilebilir.Preference Örneğin, Örneğin, aşağıdaki EditTextPreference kaydedilen öğe ile ilişkili değerini özetleyin:

EditTextPreference örneğini gösteren bir resim
Şekil 1. Örnek: EditTextPreference.

Örnek olarak aşağıdaki EditTextPreference değerini varsayalım:

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

onCreatePreferences() ürününde yeni bir SummaryProvider oluşturup geçersiz kılabilirsiniz. Özetin gösterilmesini sağlamak için provideSummary() tuşuna basın:

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

countingPreference
?.summaryProvider = SummaryProvider<EditTextPreference> { preference ->
   
val text = preference.text
   
if (text.isNullOrEmpty()) {
       
"Not set"
   
} else {
       
"Length of saved value: " + text.length
   
}
}
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) || text == null){
               
return "Not set";
           
}
           
return "Length of saved value: " + text.length();
       
}
   
});
}

Preference özetinde, kaydedilen değerin uzunluğu veya "Belirlenmedi" durumu gösterilir. kayıtlı değer olmadığında.

EditTextPreference iletişim kutusunu özelleştirme

EditTextPreference iletişim kutusunda metin alanı davranışını şu şekilde özelleştirebilirsiniz: bir OnBindEditTextListener İletişim kutusu kullanıcıya gösterildiğinde bu işleyici çağrılır.

Örneğin, bir iletişim kutusunu yalnızca sayıları kabul edecek şekilde özelleştirebilirsiniz. Öncelikle, EditTextPreference:

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

Sonra, onCreatePreferences() içinde yeni bir OnBindEditTextListener oluşturun ve onBindEditText()EditText belirtir.

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

numberPreference
?.setOnBindEditTextListener { editText ->
    editText
.inputType = InputType.TYPE_CLASS_NUMBER
}
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);
               
}
           
});
}

Artık iletişim kutusu kullanıcıya gösterildiğinde klavye yalnızca sayısal değer olarak açılıyor modunda olmalıdır, böylece kullanıcı EditText. alanına yalnızca sayı girebilir.

Tercih işlemleri

Preference, dokunulduğunda belirli bir işlem gerçekleştirebilir. Örneğin, Preference, uygulamanızın ayrı bir bölümüne bağlantı işlevi görebilir. İşlem eklemek için Preference olarak doğrudan Preference üzerinde bir Intent ayarlayabilir veya CANNOT TRANSLATE OnPreferenceClickListener mantık yürütmeliyiz.

Amaç belirleyin

Yeni bir Fragment başlatmak için Preference üzerinde Intent ayarlayabilirsiniz. Activity ya da Preference her dokunulduğunda ayrı bir uygulama kullanın. Bu, ile aynı Context.startActivity() içeren bir Intent

İç içe yerleştirilmiş bir <intent> etiketi kullanarak XML'de Intent ayarlayabilirsiniz. Aşağıdakiler örneği, Activity başlatan bir Intent tanımlar:

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

Alternatif olarak, aşağıdaki şekilde setIntent() öğesini doğrudan bir Preference üzerinde kullanabilirsiniz:

KotlinJava
val intent = Intent(context, ExampleActivity::class.java)
activityPreference
.setIntent(intent)
Intent intent = new Intent(getContext(), ExampleActivity.class);
activityPreference
.setIntent(intent);

Ayrıca XML kullanarak Intent ile ekstra özellikler de ekleyebilirsiniz:

<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>

Aşağıda, web sayfasını açan Intent içeren bir Preference örneği verilmiştir:

<Preference
       
app:key="webpage"
       
app:title="View webpage">
   
<intent
           
android:action="android.intent.action.VIEW"
           
android:data="http://www.google.com" />
</Preference>
KotlinJava
val intent = Intent(Intent.ACTION_VIEW)
intent
.data = Uri.parse("http://www.google.com")

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

OnPreferenceClickListener

Preference üzerinde bir OnPreferenceClickListener ayarlayabilirsiniz. Bu durumda, Preference dokunulduğunda onPreferenceClick() geri çağrılır. Örneğin, dinleyiciyi kullanarak başka bir Fragment veya Activity konumuna gidebilirsiniz. kullanımı daha karmaşık bir mantığa sahiptir.

OnPreferenceClickListener ayarlamak için şuna benzer bir kod kullanın:

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