Exo*_*Kid 2 android clicklistener kotlin preferencefragment
Button我无法让它工作我希望此屏幕上的注销preferences有一个ClickListener
它是这样的:
\n\n\n\n这里\xc2\xb4s 代码和buttonView始终为 NULL:
class PreferencesFragment : PreferenceFragmentCompat() {\n\n lateinit var activity: Context\n\n private var prefs: SharedPreferences = BleApplication.getInstance().getDefaultSharedPreferences()\n\n override fun onAttach(context: Context?) {\n super.onAttach(context)\n activity = requireActivity()\n }\n\n\n override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n super.onViewCreated(view, savedInstanceState)\n val buttonView = view.findViewById<View>(R.id.btn_sign_out)\n\n if (buttonView != null) {\n buttonView.setOnClickListener {\n Toast.makeText(getActivity(), "You clicked me.", Toast.LENGTH_SHORT).show()\n }\n }\n // Hide the divider\n/* setDivider(ColorDrawable(Color.TRANSPARENT))\n setDividerHeight(0)*/\n }\n\n override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n addPreferencesFromResource(R.xml.app_prefs)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我也尝试过 kotlinx.android.synthetic 但也有同样的问题
\n\n这里\xc2\xb4s是xml
\n\n<?xml version="1.0" encoding="utf-8"?>\n<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">\n\n <PreferenceCategory\n android:layout="@layout/pref_category_text"\n android:title="@string/pref_category_remote_battery_title">\n\n <SwitchPreferenceCompat\n android:key="@string/pref_key_category_remote_battery_switch"\n android:title="@string/pref_category_remote_battery_switch_title"\n android:summary="@string/pref_category_remote_battery_switch_summ"/>\n\n </PreferenceCategory>\n\n <PreferenceCategory\n android:layout="@layout/pref_category_text"\n android:title="@string/pref_category_sign_out_title">\n\n <Preference\n android:key="@string/pref_key_category_signed_out"\n android:widgetLayout="@layout/pref_category_sign_out_button"\n android:title="@string/pref_category_sign_out_button_title"\n android:summary="@string/pref_category_sign_out_buttom_summ"/>\n\n </PreferenceCategory>\n\n</PreferenceScreen>\nRun Code Online (Sandbox Code Playgroud)\n\n这里是"@layout/pref_category_sign_out_button"布局
<?xml version="1.0" encoding="utf-8"?>\n<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:orientation="vertical">\n\n <Button\n android:id="@+id/btn_sign_out"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:background="@drawable/buttonshape"\n android:text="@string/pref_category_sign_out_title" />\n</LinearLayout>\nRun Code Online (Sandbox Code Playgroud)\n
由于您的Fragment扩展自PreferenceFragmentCompat,因此您不应该尝试设置 aView.OnClickListener而是覆盖PreferenceFragmentCompat.onPreferenceTreeClick()。根据文档,这种方法是...
当单击以此 PreferenceScreen 为根的树中的首选项时调用。
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;
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
这将使您能够捕获 的点击事件,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>
Run Code Online (Sandbox Code Playgroud)
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();
}
});
}
}
}
Run Code Online (Sandbox Code Playgroud)