Поскольку ваш Fragment
расширяется от PreferenceFragmentCompat
, вам не следует пытаться установить View.OnClickListener
, а вместо этого переопределить PreferenceFragmentCompat.onPreferenceTreeClick()
. Согласно документации , этот метод ...
Вызывается при щелчке по предпочтению в дереве с корнем на этом экране предпочтений.
Пример кода на Java:
@Override
onPreferenceTreeClick(Preference preference){
if(preference.getKey().equals(getContext().getString(R.string.pref_key_category_signed_out))){
// user clicked signout "button"
// take appropriate actions
// return "true" to indicate you handled the click
return true;
}
return false;
}
Пример кода в Kotlin (надеюсь, я могу доверять Android Studio: P)
override fun onPreferenceTreeClick(preferenceScreen: PreferenceScreen, preference: Preference): Boolean {
return if (preference.key == context.getString(R.string.pref_key_category_signed_out)) {
// user clicked signout "button"
// take appropriate actions
// return "true" to indicate you handled the click
true
} else false
}
Это позволит вам отлавливать события щелчка для Preference
, но не для Button
.
Для этого также можно использовать пользовательский Preference
и переопределить onBindViewHolder(PreferenceViewHolder)
. Поскольку PreferenceViewHolder
- аналогично RecyclerView.ViewHolder
- имеет поле itemView
, которое содержит раздутый макет, у нас есть хорошая возможность установить наш собственный View.OnClickListener
.
SignOutPreference
расширяется от TwoStatePreference
(в библиотеке com.android.support: preference-v7 ), поскольку для замены виджета CheckBox
на пользовательский Button
требуется только установить android:widgetLayout
атрибут, как вы делаете в своем фрагменте кода:
<PreferenceCategory
android:layout="@layout/pref_category_text"
android:title="@string/pref_category_sign_out_title">
<your.package.name.SignOutPreference
android:key="@string/pref_key_category_signed_out"
android:widgetLayout="@layout/pref_category_sign_out_button"
android:title="@string/pref_category_sign_out_button_title"
android:summary="@string/pref_category_sign_out_buttom_summ"/>
</PreferenceCategory>
SignOutPreference.java
public class SignOutPreference extends TwoStatePreference {
public SignOutPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public SignOutPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SignOutPreference(Context context) {
super(context);
}
@Override
public void onBindViewHolder(final PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
Button button = holder.itemView.findViewById(R.id.btn_sign_out);
if(button != null){
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(holder.itemView.getContext(), "CLICKED!", Toast.LENGTH_SHORT).show();
}
});
}
}
}