【问题标题】:Custom Preference - Button not clickable自定义首选项 - 按钮不可点击
【发布时间】:2014-10-03 13:15:15
【问题描述】:

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

我尝试在按钮布局根目录上添加 beforeDescendants 但没有运气。还尝试将可聚焦的 false 添加到按钮,但仍然没有运气。

谁能分享一些关于如何让偏好按钮响应的提示? 谢谢!

【问题讨论】:

  • 你检查this答案了吗?
  • 不知道这有什么关系?
  • "您必须为每个个人偏好注册 PreferenceClickListener somePreference.setOnPreferenceClickListener(this);"我还建议发布您的代码
  • 我正在这样做。我已经说过我在此首选项上设置 OnPreferenceClickListener 但单击按钮时没有任何反应。
  • 在调用监听器启用按钮之前您是否尝试过? myButton.setEnabled(true);

标签: android android-fragments preference


【解决方案1】:

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

  1. 创建自定义 Preference 类并覆盖 onCreateView
  2. 在 onCreateView 方法中,您从超类中获取膨胀布局并找到 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"/>

【讨论】:

    【解决方案2】:

    我会使用类似于下面的代码来实现这个:

    @Override
    protected View onCreateView (ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View customRow = inflater.inflate(R.layout.preferences_station_list_row, null);
        ((ImageButton) customRow.findViewById(R.id.pref_delete_station)).setOnClickListener(new OnClickListener() {      
            @Override
            public void onClick(View v) {
               //perform whatever you need to button to do here.
            }
        });
    
        customRow.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog(null);
            }
        });
        customRow.setClickable(true);
        return customRow;
    }
    

    这解决了您的问题吗?

    【讨论】:

      【解决方案3】:

      覆盖 Preference 方法中的 'onClick()' 并确保您的自定义布局没有

       android:clickable="true"
      

      你不需要任何特别的东西,但是如果你的布局包含一个带有 android:clickable="true" 的视图,它就会完全搞砸。

      【讨论】:

        【解决方案4】:

        类似于@Emanuel Moecklin 的回答,在 2022 年你可以使用 androidx Preference:

        class FooterPreference(context: Context, attrs: AttributeSet): Preference(context, attrs) {
        
            override fun onBindViewHolder(holder: PreferenceViewHolder?) {
                super.onBindViewHolder(holder)
                holder?.itemView?.findViewById<Button>(R.id.btn)?.setOnClickListener {
                    Timber.d("button clicked")
                }
            }
        }
        
        <packageName.FooterPreference
                app:layout="@layout/layout_preference_footer" />
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-07
          • 2019-04-30
          • 2013-10-02
          相关资源
          最近更新 更多