我是Android新手(具有iOS背景),我想做以下事情: 我做了一个PreferenceFragment,在其中我要求用户将他的凭据连接到我的WebServices。当我检测到我的服务器拒绝了这些凭据时,我想向我的用户显示一个对话框(模态),他可以在其中编辑他的首选项(凭据)。
我已经设法使用PreferenceActivity来完成它。所以当我点击一个bouton时,我执行以下代码:
Intent settingsActivity = new Intent(getActivity().getBaseContext(), PreferencesConnection.class);
startActivity(settingsActivity);
将PreferenceActivity作为带有XML资源的对话加载:
addPreferencesFromResource(R.xml.preferences_connection);
但这是折旧的。我可以这样做,但有片段吗?我应该使用DialogFragment来显示我的PreferenceFragment吗?在DialogFragment中重建我的凭据会更容易吗?我应该使用Activity而不是Fragment吗?
答案 0 :(得分:1)
要执行不带PreferenceHeaders的旧式单页设置屏幕,请执行以下操作:
在调用设置屏幕的活动中(例如在onMenuItemSelected中):
case R.id.menuSettings:
Intent settingsIntent = new Intent(this, SettingsActivity.class);
startActivityForResult(settingsIntent, GC.SETTINGS_ACTIVITY_ID);
break;
在XML文件夹中,创建一个旧式的PreferenceScreen。 PreferenceCategory,ListPreference,CheckBoxPreference等。不要使用PreferenceHeaders
创建设置活动:
package com.mycompany.project1;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
public class SettingsActivity extends PreferenceActivity {
private final static String TAG = "SettingsAcitivity";
public SettingsActivity() {}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyLog.d(TAG, "onCreate");
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new LocationFragment()).commit();
}
public static class LocationFragment extends PreferenceFragment {
private String TAG = "LocationFragment";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyLog.d(TAG, "onCreate");
addPreferencesFromResource(R.xml.settings);
}
}
}
不要将对话框主题与设置活动相关联。对于某些首选项类型(如单选按钮),您将获得奇怪的结果。 (我尝试了对话框,无法找到编码错误。当我使用标准活动主题而不是对话框主题时,一切正常。显然,全息对话框主题与设置定义相冲突。
注意:我使用了startActivityforResult,因此我可以重新初始化更改的特定设置值。