如何为此按钮设置点击监听器

Exo*_*Kid 2 android clicklistener kotlin preferencefragment

Button我无法让它工作我希望此屏幕上的注销preferences有一个ClickListener

\n\n

它是这样的:

\n\n

在此输入图像描述

\n\n

这里\xc2\xb4s 代码和buttonView始终为 NULL:

\n\n
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}\n
Run 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>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里是"@layout/pref_category_sign_out_button"布局

\n\n
<?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>\n
Run Code Online (Sandbox Code Playgroud)\n

0X0*_*gar 5

由于您的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)