我正在设置屏幕上工作,我使用Android的首选项API来构建界面。 其中一个首选项将是一个按钮 - 我已经通过将自定义布局添加到首选项来完成此操作。它的工作原理 - 按钮显示为我想要的但问题是,当设置OnPreferenceClickListener没有任何反应。它没有被触发。自定义首选项 - 按钮不可点击
我已经尝试在按钮布局根上添加beforeDescents,但没有运气。还试图添加可聚焦的虚假的按钮,但仍然没有运气。
任何人都可以请分享一些技巧,我如何使偏好按钮响应? 谢谢!
我正在设置屏幕上工作,我使用Android的首选项API来构建界面。 其中一个首选项将是一个按钮 - 我已经通过将自定义布局添加到首选项来完成此操作。它的工作原理 - 按钮显示为我想要的但问题是,当设置OnPreferenceClickListener没有任何反应。它没有被触发。自定义首选项 - 按钮不可点击
我已经尝试在按钮布局根上添加beforeDescents,但没有运气。还试图添加可聚焦的虚假的按钮,但仍然没有运气。
任何人都可以请分享一些技巧,我如何使偏好按钮响应? 谢谢!
onPreferenceClick当单击Prefererence时触发,而不是单击按钮时触发。如果你想捕捉按钮点击,你需要在按钮本身上设置一个OnClickListener。问题是检索充气按钮,因为Preference类没有findViewById方法或类似的东西。以下是我想做到这一点:
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"/>
我会用相似的代码下面的东西来实现这一点:
@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;
}
已经解决了这个问题的?
改写从Preference法 'onClick()',并确保您的自定义布局没有:
android:clickable="true"
您不需要任何其他特别的东西,但是如果您的布局包含a的视图ndroid:clickable =“true”它完全混淆了它。
您是否检查过[这个](http://stackoverflow.com/questions/16449372/onpreferenceclick-and-onpreferenceclicklistener)回答? – 2014-10-03 13:30:00
我不知道这是怎么相关的? – Alin 2014-10-03 13:35:14
“您必须注册PreferenceClickListener每个人的偏好 somePreference.setOnPreferenceClickListener(this);”我也建议发布你的代码 – 2014-10-03 13:40:20