我正在处理设置屏幕,并使用 Android 的 Preference API 来构建界面。 其中一个首选项是一个按钮 - 我通过向首选项添加自定义布局来完成它。它有效 - 按钮按我想要的方式显示,但问题是设置 OnPreferenceClickListener 时什么也没有发生。它没有被触发。
我尝试在按钮布局根上添加 beforeDescendants 但没有成功。还尝试向按钮添加 focusable false 但仍然没有成功。
任何人都可以分享一些关于如何使首选项按钮响应的提示吗? 谢谢!
最佳答案
onPreferenceClick 在单击首选项时触发,而不是在单击按钮时触发。如果你想捕获按钮点击,你需要在按钮本身上设置一个 OnClickListener。问题是检索膨胀的按钮,因为 Preference 类没有 findViewById 方法或类似的方法。我的做法如下:
- 创建自定义 Preference 类并覆盖 onCreateView
- 在 onCreateView 方法中,您从父类(super class)中获取膨胀的布局并找到 Button
- 向按钮添加 OnClickListener
- 在首选项布局文件中使用自定义首选项类
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/