我在设置屏幕上工作,并且我使用Android的Preference API来构建界面。 其中一个偏好是按钮 - 我已经通过向首选项添加自定义布局来完成它。它工作 - 按钮显示为我想要但但问题是,当设置OnPreferenceClickListener时没有任何反应。它没有被触发。
我尝试在按钮布局根目录上添加beforeDescendants但没有运气。还尝试在按钮上添加可聚焦的假,但仍然没有运气。
任何人都可以分享一些关于如何让偏好按钮响应的提示吗? 谢谢!
答案 0 :(得分:3)
onPreferenceClick在单击优先级时触发,而不是在单击按钮时触发。如果要捕获按钮单击,则需要在按钮本身上设置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"/>
答案 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; 它会完全混乱。