启动片段调用activity的onCreate()

时间:2016-02-03 22:58:49

标签: android android-fragments

我有一个带有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?有关诊断此问题的任何建议都会有所帮助。

1 个答案:

答案 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;
    }
}