我有一个在启动时加载的设置活动HomeActivity。由于某些要求,启动模式设置为singleTask。在HomeActivity的布局中,有一个带有图标,标题和开关的元素。这个想法是你应该能够使用开关启用/禁用呼叫。如果单击该行(在交换机外部),您将进入一个新活动CallPreferences,您可以在其中设置呼叫特定设置。在CallPreferences的操作栏上,还应该存在一个开关,用户可以再次启用/禁用呼叫。两个活动的开关应该反映“现实”。也就是说,当交换机改变时,该值被存储到共享的首选项。然后,两个交换机都从共享的prefs onCreate中读取,以将其值设置为on或off。
在HomeActivity的xml中,我有一个如下所示的首选项屏幕:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:foo="http://schemas.android.com/apk/lib/com.xxx.yy" >
<com.xxx.yy.preferences.IconSwitchPreference
foo:icon="@drawable/call_icn"
android:title="@string/call"
android:key="callIconSwitchPreference" >
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.xxx.yy.preferences.CallPreferences"
android:targetPackage="om.xxx.yy" />
</com.xxx.yy.preferences.IconSwitchPreference>
</PreferenceScreen>
IconSwitchPreference是我的自定义首选项布局,包含线性布局,标题的文本视图,图像视图和开关:
<?xml version="1.0" encoding="utf-8"?>
<!-- Layout for a Preference in a PreferenceActivity. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingRight="?android:attr/scrollbarSize">
<Switch
android:id="@+id/menu_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:focusable="false"
android:focusableInTouchMode="false"
android:onClick="onMenuSwitchClicked" />
</LinearLayout>
运行代码的类:
public class IconSwitchPreference extends IconPreference {
public IconSwitchPreference(Context context) {
this(context, null);
}
public IconSwitchPreference(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public IconSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setLayoutResource(R.layout.preference_icon_switch);
if (attrs != null) {
int iconResId = attrs.getAttributeResourceValue(XMLNS, "icon", 0);
mIcon = context.getResources().getDrawable(iconResId);
mFilter = attrs.getAttributeValue(XMLNS, "filter");
mUrl = attrs.getAttributeValue(XMLNS, "url");
}
}
}
在CallPreferences中,我以编程方式创建开关并将其添加到操作栏:
private void createActionBarSwitch() {
ActionBar actionBar = getActionBar();
Switch actionBarSwitch = new Switch(this);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
ActionBar.DISPLAY_SHOW_CUSTOM);
actionBar.setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
ActionBar.LayoutParams.WRAP_CONTENT,
ActionBar.LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL
| Gravity.RIGHT));
actionBarSwitch.setChecked(isSwitchOn());
}
这可行,我可以将开关设置为存储值,并更新开关以反映该值。
在HomeActivity中,交换机未更新以反映该值。
以下不工作:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.preference_icon_switch, null);
TextView tv = (TextView)view.findViewById(android.R.id.title);
tv.setText("Test");
Switch menuSwitch = (Switch)view.findViewById(R.id.menu_switch);
menuSwitch.setChecked(sharedPrefs.isCallhandlingEnabled());
}
文本视图都没有更改为测试,也没有启用开关(默认值为false)。
以下情况有效:
final IconSwitchPreference ic = (IconSwitchPreference) findPreference("callIconSwitchPreference");
ic.setTitle("Test");
标题设置为“测试”。唯一的问题是我没有任何对开关的引用,所以我可以更新它的值。是否可以更新IconSwitchPreference.java以在其使用的xml中提取和存储对交换机的引用?
我尝试了很多解决方案和代码示例;但他们都有一些不起作用的东西。另一种解决方案是使用标准的SwitchPreference,但是在切换开关本身以更改其状态(不进行新活动)和单击行以进入活动之间没有区别(不更改开关)值)。
答案 0 :(得分:0)
通过将以下标记添加到HomeActivity xml:
解决了该问题<强> FOO:switchPref = “@串/ call_enabled_pref_key”强>
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:foo="http://schemas.android.com/apk/lib/com.xxx.yy" >
<com.xxx.yy.preferences.IconSwitchPreference
foo:icon="@drawable/call_icn"
android:title="@string/call"
android:key="callIconSwitchPreference"
foo:switchPref="@string/call_enabled_pref_key" >
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.xxx.yy.preferences.CallPreferences"
android:targetPackage="om.xxx.yy" />
</com.xxx.yy.preferences.IconSwitchPreference>
</PreferenceScreen>
然后在IconSwitchPreference.java中我提取res id:
mSwitchPrefResId = attrs.getAttributeResourceValue(XMLNS,“switchPref”,0);
public IconSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setLayoutResource(R.layout.preference_icon_switch);
if (attrs != null) {
int iconResId = attrs.getAttributeResourceValue(XMLNS, "icon", 0);
mIcon = context.getResources().getDrawable(iconResId);
mFilter = attrs.getAttributeValue(XMLNS, "filter");
mUrl = attrs.getAttributeValue(XMLNS, "url");
mSwitchPrefResId = attrs.getAttributeResourceValue(XMLNS, "switchPref", 0);
}
}
}
同一个类中的onBindView(IconSwitchPreference.java)我得到了对Switch的引用:
@Override
public void onBindView(View view) {
super.onBindView(view);
mSwitch = (Switch) view.findViewById(R.id.menu_switch);
updateSwitch();
}
然后我使用mSwitchPrefResId来获取共享的prefs(知道交换机是否启用)并将mSwitch设置为相应的值。