2014-10-03 132 views
1

我正在设置屏幕上工作,我使用Android的首选项API来构建界面。 其中一个首选项将是一个按钮 - 我已经通过将自定义布局添加到首选项来完成此操作。它的工作原理 - 按钮显示为我想要的但问题是,当设置OnPreferenceClickListener没有任何反应。它没有被触发。自定义首选项 - 按钮不可点击

我已经尝试在按钮布局根上添加beforeDescents,但没有运气。还试图添加可聚焦的虚假的按钮,但仍然没有运气。

任何人都可以请分享一些技巧,我如何使偏好按钮响应? 谢谢!

+0

您是否检查过[这个](http://stackoverflow.com/questions/16449372/onpreferenceclick-and-onpreferenceclicklistener)回答? – 2014-10-03 13:30:00

+0

我不知道这是怎么相关的? – Alin 2014-10-03 13:35:14

+1

“您必须注册PreferenceClickListener每个人的偏好 somePreference.setOnPreferenceClickListener(this);”我也建议发布你的代码 – 2014-10-03 13:40:20

回答

3

onPreferenceClick当单击Prefererence时触发,而不是单击按钮时触发。如果你想捕捉按钮点击,你需要在按钮本身上设置一个OnClickListener。问题是检索充气按钮,因为Preference类没有findViewById方法或类似的东西。以下是我想做到这一点:

  1. 创建自定义优先级并覆盖onCreateView
  2. 在你抢从超类充气布局onCreateView方法,找到按钮
  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"/> 
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; 
} 

已经解决了这个问题的?

0

改写从Preference法 'onClick()',并确保您的自定义布局没有

android:clickable="true" 

您不需要任何其他特别的东西,但是如果您的布局包含a的视图ndroid:clickable =“true”它完全混淆了它。