0

当我在使用应用程序时更改 PreferenceFragment 屏幕上的方向时,我的应用程序被强制停止。我不想将方向应用为我的应用程序的仅纵向或仅横向。提前致谢。

日志猫 ::

12-24 21:46:52.296    7540-7540/com.example.timepass.sampleapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.timepass.sampleapp, PID: 7540
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.timepass.sampleapp/com.example.timepass.sampleapp.PreferencesActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3912)
        at android.app.ActivityThread.access$900(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference
        at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:95)
        at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:88)
        at android.support.v7.internal.app.ToolbarActionBar.<init>(ToolbarActionBar.java:84)
        at android.support.v7.app.ActionBarActivityDelegateBase.setSupportActionBar(ActionBarActivityDelegateBase.java:175)
        at android.support.v7.app.ActionBarActivity.setSupportActionBar(ActionBarActivity.java:92)
        at com.example.timepass.sampleapp.PreferencesActivity$SettingsPreference.onCreate(PreferencesActivity.java:109)
        at android.app.Fragment.performCreate(Fragment.java:2031)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:863)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049)
        at android.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1864)
        at android.app.Activity.onCreate(Activity.java:935)
        at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:255)
        at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:122)
        at com.example.timepass.sampleapp.PreferencesActivity.onCreate(PreferencesActivity.java:31)
        at android.app.Activity.performCreate(Activity.java:5933)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3912)
at android.app.ActivityThread.access$900(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

PreferencesActivity.java

public class PreferencesActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings);
getFragmentManager().beginTransaction()
        .replace(R.id.content_frame, new SettingsPreference())
         .commit();
}

public static class SettingsPreference extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
   // applyTheme();
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.pref_settings);
    android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) getActivity().findViewById(R.id.toolbar);
    ((ActionBarActivity)getActivity()).setSupportActionBar(toolbar);

}
}

设置.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.timepass.sampleapp.Settings"
android:fitsSystemWindows="true">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:navigationContentDescription="@string/abc_action_bar_up_description"
app:navigationIcon="?attr/homeAsUpIndicator"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="@string/action_settings" />
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/toolbar" />

</RelativeLayout>
4

1 回答 1

0

移动以下行

android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) getActivity().findViewById(R.id.toolbar);
((ActionBarActivity)getActivity()).setSupportActionBar(toolbar);

到回调里面Fragment#onActivityCreated(Bundle savedInstanceState)

原因是当Fragment#onCreate(Bundle savedInstanceState)被调用时,Activity还没有实例化。该方法此时Fragment#getActivity()可能返回 null,并保证返回Activityin Fragment#onActivityCreated(...)

于 2014-12-25T03:54:36.917 回答