尝试setTitle()为Preference时出现NullPointerException

时间:2013-01-18 16:20:16

标签: java android

我有一个帐户信息活动,我需要使用PreferenceFragment显示我从互联网上获得的帐户信息。

我正在尝试为偏好设置标题,但每当我尝试这样做时我都会java.lang.NullPointerExcption

那么问题是什么,我该怎么办?

AccountData.java

import android.app.Activity;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;

public class AccountData extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new PrefsFragment()).commit();


        try {
            PrefsFragment PF = new PrefsFragment();
            PF.setAccountName();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static class PrefsFragment extends PreferenceFragment {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            addPreferencesFromResource(R.xml.account_data);
        }

        public void setAccountName() {
            Preference AccountName = (Preference) findPreference("account_name");
            AccountName.setTitle("Account Name");
        }
    }
}

account_data.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <PreferenceCategory android:title="@string/account" >
        <Preference
            android:key="account_name"
            android:selectable="false"
            android:summary="@string/account_name"
            android:title="@string/none" />
        <Preference
            android:key="account_type"
            android:selectable="false"
            android:summary="@string/account_type"
            android:title="@string/none" />
    </PreferenceCategory>

</PreferenceScreen>

_ ** 被修改 ** _

Stacktrace

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.AccountData}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2088)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113)
    at android.app.ActivityThread.access$700(ActivityThread.java:139)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1224)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4918)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
    at com.example.app.AccountData$PrefsFragment.setAccountName(AccountData.java:39)
    at com.example.app.AccountData.onCreate(AccountData.java:21)
    at android.app.Activity.performCreate(Activity.java:5048)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052)
    ... 11 more

2 个答案:

答案 0 :(得分:1)

尝试将调用移动到片段的onResume()。

public void onResume() {
        Preference AccountName = (Preference) findPreference("account_name");
        AccountName.setTitle("Account Name");
}

我从未使用过“PreferenceFragment”,但可能是因为UI尚未初始化。对onCreate的调用来自UI线程,并将阻止其他UI事务,例如添加片段。所以,即使你已经在你的用户界面中添加了一个片段,这是一个延迟的电话,但还没有得到任何回调。

答案 1 :(得分:0)

这个

        PrefsFragment PF = new PrefsFragment();
        PF.setAccountName();

确实有效,因为这不会调用onCreate。

仅使用一个PrefsFragment实例。