android - 自定义首选项 - 按钮不可点击

标签 android android-fragments preference

我正在处理设置屏幕,并使用 Android 的 Preference API 来构建界面。 其中一个首选项是一个按钮 - 我通过向首选项添加自定义布局来完成它。它有效 - 按钮按我想要的方式显示,但问题是设置 OnPreferenceClickListener 时什么也没有发生。它没有被触发。

我尝试在按钮布局根上添加 beforeDescendants 但没有成功。还尝试向按钮添加 focusable false 但仍然没有成功。

任何人都可以分享一些关于如何使首选项按钮响应的提示吗? 谢谢!

最佳答案

onPreferenceClick 在单击首选项时触发,而不是在单击按钮时触发。如果你想捕获按钮点击,你需要在按钮本身上设置一个 OnClickListener。问题是检索膨胀的按钮,因为 Preference 类没有 findViewById 方法或类似的方法。我的做法如下:

  1. 创建自定义 Preference 类并覆盖 onCreateView
  2. 在 onCreateView 方法中,您从父类(super class)中获取膨胀的布局并找到 Button
  3. 向按钮添加 OnClickListener
  4. 在首选项布局文件中使用自定义首选项类

public class CustomPreference extends Preference  {

    public CustomPreference(Context context) {
        super(context);
    }

    public CustomPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected View onCreateView(ViewGroup parent) {
        View preferenceView = super.onCreateView(parent);

        setOnClickListener(preferenceView);

        return preferenceView;
    }

    private void setOnClickListener(View preferenceView) {
        if (preferenceView != null && preferenceView instanceof ViewGroup) {
            ViewGroup widgetFrameView = ((ViewGroup)preferenceView.findViewById(android.R.id.widget_frame));
            if (widgetFrameView != null) {
                // find the button
                Button theButton = null;
                int count = widgetFrameView.getChildCount();
                for (int i = 0; i < count; i++) {
                    View view = widgetFrameView.getChildAt(i);
                    if (view instanceof Button) {
                        theButton = (Button)view;
                        break;
                    }
                }

                if (theButton != null) {
                    // set the OnClickListener
                    theButton.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            // do whatever you want to do
                        }
                    });
                }
            }
        }
    }
}

这将替换 xml 文件中的首选项:

<yourpackage.CustomPreference
    android:key="your_id"
    android:title="@string/your_title"
    android:summary="@string/your_summary"/>

关于android - 自定义首选项 - 按钮不可点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26179663/

相关文章:

java - GoogleMaps v2 Android 的我的位置按钮,不显示

java - ListView 未导航到其他 Activity

android - android-support-v4 版本中的 fragment ID。 22

Android - 使用 PreferenceScreen 显示和保存设置到/从 ContentProvider

android - 如何从首选项 Activity 调用 Activity ?

Android 在 PreferenceActivity 中获取 Preference View

android - 当使用 foreach 循环遍历 arraylist 不使实例成为最终实例时,是否有解决方法?

java - 无法创建底部导航 View - 尝试膨胀时变空

android - 在 fragment 中测量 View

java - 当其他 fragment 更改第一个 fragment 模型时刷新 fragment