我有一个带有PreferenceFragment的AppCompatPreference SettingsActivity,如下所示:
public class SettingsActivity extends AppCompatPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "activity onCreate called");
setupActionBar();
String userString = getIntent().getStringExtra(LoginActivity.USER);
Log.v(TAG, "UserString: " + userString);
...
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "GeneralPreferenceFragment onCreate called");
addPreferencesFromResource(R.xml.pref_general);
setHasOptionsMenu(true);
}
}
}
当我启动应用程序时,LoginActivity会对服务器进行身份验证,并将用户数据(userString)传递给SettingsActivity。然后它使用该数据启动服务。
一切都很好,服务开始没有问题。
D/SettingsActivity: activity onCreate called
V/SettingsActivity: UserString: {some string of JSON user data}
然后我点击General Preferences
。一旦我这样做,就会记录下来:
D/SettingsActivity: activity onCreate called
V/SettingsActivity: UserString: null
因为它记录了activity onCreate called
而不是GeneralPreferenceFragment onCreate called
,所以似乎调用了错误的onCreate()。然后应用程序崩溃并尝试使用NullPointException以空用户启动服务。
我想弄明白这一点。也许the entire activity is restarting for some reason?有关诊断此问题的任何建议都会有所帮助。
答案 0 :(得分:1)
如您的日志所示,将创建一个新的活动实例。
这是PreferenceActivity
在手机上的预期行为。平板电脑使用双窗格布局并保留单个活动。但手机开始了新的活动。
AppCompat的行为相同。
然而,您可以使用
将更多数据传递给片段public class MySettingsActivity extends PreferenceActivity {
@Override
public void onBuildHeaders(List<Header> target) {
super.onBuildHeaders(target);
// You can build with xml settings that don't depend from UserString
loadHeadersFromResource(R.xml.preferences, target);
// For Settings that depend on UserString:
Header userHeader = new Header();
userHeader.title = ""; // TODO
user.fragment = UserFragment.class;
Bundle args = new Bundle(1);
// TODO Pass a User parcelable instead
args.putString(EXTRA_USER, userString);
userHeader.fragmentArguments = args;
}
}