自定义首选项 - 按钮无法点击

时间:2014-10-03 13:15:15

标签: android android-fragments preference

我在设置屏幕上工作,并且我使用Android的Preference API来构建界面。 其中一个偏好是按钮 - 我已经通过向首选项添加自定义布局来完成它。它工作 - 按钮显示为我想要但但问题是,当设置OnPreferenceClickListener时没有任何反应。它没有被触发。

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

任何人都可以分享一些关于如何让偏好按钮响应的提示吗? 谢谢!

3 个答案:

答案 0 :(得分:3)

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

  1. 创建自定义Preference类并覆盖onCreateView
  2. 在onCreateView方法中,您从超类中获取膨胀的布局并找到Button
  3. 将OnClickListener添加到按钮
  4. 在偏好设置文件
  5. 中使用自定义偏好设置类
      

    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"/>
    

答案 1 :(得分:0)

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

@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;
}

这是否解决了您的问题?

答案 2 :(得分:0)

覆盖&#39; onClick()&#39;从Preference方法开始,确保您的自定义布局没有

 android:clickable="true"

你不需要任何其他特别的东西,但是如果你的布局包含一个带有 android的视图:clickable =&#34; true&#34; 它会完全混乱。