我有一个首选项屏幕,我正在使用android:layout
属性指定布局资源。在偏好活动中,我使用addPreferencesFromResource
方法中的onCreate
来使用/扩充偏好设置。在布局内部我有很少的文本视图和按钮。
问题是我无法使用findViewById
方法找到任何textview,复选框和按钮! findViewById
的每个结果都返回null。
修改:
我需要将一个监听器附加到复选框。
有人可以帮助我吗?
编辑2 :
1)preference_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="33dp"
android:gravity="center_vertical"
android:minHeight="33dp"
android:id="@+id/preference_header_switch_item_responder_layout"
style="?android:attr/listSeparatorTextViewStyle" >
<CheckBox
android:id="@+id/switchWidget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:clickable="true"
android:focusable="false"
android:padding="8dip"
android:layout_marginRight="14dip" />
</LinearLayout>
2)偏好设置屏幕
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<Preference
android:defaultValue="false"
android:key="auto_responder_key"
android:widgetLayout="@layout/preference_layout"
android:title="@string/auto_responder">
</Preference>
</PreferenceScreen>
3)关于创建的偏好活动:
编辑3:
@Override
protected void onCreate(Bundle savedInstanceState)
{
if(savedInstanceState != null && savedInstanceState.containsKey(HEADERS_KEY))
{
headers = savedInstanceState.getParcelableArrayList(HEADERS_KEY);
}
super.onCreate(savedInstanceState);
applicationContext = getApplicationContext();
setupSimplePreferencesScreen();
// setContentView(getListView());
headerCompound = findViewById(R.id.switchWidget);
headerCompoundEmail = findViewById(R.id.switchWidgetEmail);
}
和
private void setupSimplePreferencesScreen()
{
if (!isSimplePreferences(this))
{
return;
}
addPreferencesFromResource(R.xml.responder_generic);
PreferenceCategory fakeHeader = new PreferenceCategory(this);
fakeHeader.setLayoutResource(R.layout.place_holder_auto_reply_header);
getPreferenceScreen().addPreference(fakeHeader);
addPreferencesFromResource(R.xml.auto_reply_sms_call_check_box_preference);
addPreferencesFromResource(R.xml.auto_reply_preferences);
Preference smsTemplatePreference = findPreference(SMS_TEMPLATE_KEY);
if(smsTemplatePreference != null)
{
bindPreferenceSummaryToValue(smsTemplatePreference);
}
Preference customTemplatePreference = findPreference(SMS_CUSTOM_TEMPLATE_KEY);
if(customTemplatePreference != null)
{
customTemplatePreference.setEnabled(false);
bindPreferenceSummaryToValue(customTemplatePreference);
getPreferenceScreen().removePreference(customTemplatePreference);
}
// Add 'email' preferences, and a corresponding header.
// Add 'email header' preferences.
addPreferencesFromResource(R.xml.email_enable_check);
addPreferencesFromResource(R.xml.email_preferences);
Preference passwordPreference = findPreference(EMAIL_PWD_KEY);
if(passwordPreference != null)
{
bindPreferenceSummaryToValue(passwordPreference);
// the advanced version of SMS template
}
Preference customPasswordPreference = findPreference(EMAIL_CUSTOM_PWD_KEY);
if(customPasswordPreference != null)
{
bindPreferenceSummaryToValue(customPasswordPreference);
getPreferenceScreen().removePreference(customPasswordPreference);
}
// Add 'network' preferences, and a corresponding header.
fakeHeader = new PreferenceCategory(this);
fakeHeader.setLayoutResource(R.layout.place_holder_network_header);
getPreferenceScreen().addPreference(fakeHeader);
addPreferencesFromResource(R.xml.network_preferences_check_box);
// Add 'misc' preferences, and a corresponding header.
fakeHeader = new PreferenceCategory(this);
fakeHeader.setLayoutResource(R.layout.place_holder_misc_header);
getPreferenceScreen().addPreference(fakeHeader);
addPreferencesFromResource(R.xml.misc_preferences);
addPreferencesFromResource(R.xml.misc_reject_ignore_check_box_preferences);
// Bind the summaries of EditText/Switch/CheckBox preferences to
// their values. When their values change, their summaries are updated
// to reflect the new value, per the Android Design guidelines.
bindPreferenceSummaryToValue(findPreference(AUTO_REPLY_SMS_KEY));
bindPreferenceSummaryToValue(findPreference(AUTO_REPLY_CALL_KEY));
bindPreferenceSummaryToValue(findPreference(DATA_NETWORK_KEY));
bindPreferenceSummaryToValue(findPreference(WIFI_KEY));
bindPreferenceSummaryToValue(findPreference(PASSCODE_KEY));
bindPreferenceSummaryToValue(findPreference(EMAIL_USR_KEY));
bindPreferenceSummaryToValue(findPreference(EMAIL_INT_KEY));
bindPreferenceSummaryToValue(findPreference(AUTO_RESPONDER_KEY));
}
我也尝试了onPostCreate
中的上述代码,但返回的值仍为null。
我想查找responder_generic.xml和email_preferences.xml的复选框。有没有办法找到并添加监听器?
谢谢, Adithya
答案 0 :(得分:3)
我所做的是创建自定义首选项并且它有效。我只是扩展了Preference
类并夸大了布局/%MY_LAYOUT%.xml中提供的布局。听众也被召唤,这就是我想要实现的目标。
我认为这个解决方案无处不在,因此,我将此添加到社区Wiki。
注意:如果添加了一个首选项,那么single preference solution就足够了。我在屏幕上添加了多个首选项(在我的情况下为2),我实现了自定义首选项。
答案 1 :(得分:0)
根据您的要求,您在使用
时似乎无法获得任何视图findViewById()
因此,这种行为的一个可能原因可能是您可能没有调用
setContentView(R.id.yourlayout);
在你的代码中查看...
答案 2 :(得分:0)
我试图将一个RadioGroup直接放在PreferenceScreen中时遇到了同样的问题。我在创建Activity时尝试设置已检查的RadioButton(例如,从sharedpreferences恢复布尔值)但我无法从OnCreate方法中找到ViewById或类似的内容。 这是我(丑陋但有效)的解决方案: 我扩展了RadioButton类:
public class RadioButtonSettings extends RadioButton {
public RadioButtonSettings(Context context, AttributeSet attrs) {
super(context, attrs);
boolean isLocal = context.getSharedPreferences("",Context.MODE_PRIVATE).getBoolean("local",true);
switch(getId()){
case R.id.radio_in:
if(isLocal)
setChecked(true);
break;
case R.id.radio_out:
if(!isLocal)
setChecked(true);
break;
default:
break;
}
}}
然后将放在您的preferences.xml文件中(由PreferenceActivity加载):
<PreferenceCategory
android:title="CATEGORY EXAMPLE">
<Preference android:layout="@xml/category_one"
android:selectable="false"
android:key="radiobuttons">
</Preference>
</PreferenceCategory>
最后在res / xml目录中创建另一个文件(名为category_one.xml)并放入:
<RadioGroup
android:id="@+id/radio"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<your.package.RadioButtonSettings
tools:context="your.package.SettingsActivity"
android:id="@+id/radio_in"
android:text="@string/radioIn"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</your.package.RadioButtonSettings>
<your.package.RadioButtonSettings
tools:context="your.package.SettingsActivity"
android:id="@+id/radio_out"
android:text="@string/radioOut"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</your.package.RadioButtonSettings>
</RadioGroup>
你也可以使用android:onClick =&#34;&#34;从xml文件中选择以获取OnClickListener。 在特定情况下,它是一个简单的检查布尔&#34;本地&#34; (radiobutton&#34; in&#34;和radiobutton&#34; out&#34;)。您还可以显然覆盖其他经典方法。我认为这可能比扩展整个Preference类更好。希望它会帮助某人。