0

アカウント情報アクティビティがあり、インターネットから取得したアカウント情報を 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>

_ **編集済み ** _

スタックトレース

    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
4

2 に答える 2

1

呼び出しをフラグメントの onResume() に移動してみてください。

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

「PreferenceFragment」を使ったことはありませんが、おそらく UI がまだ初期化されていないためです。onCreate の呼び出しは UI スレッドからのもので、フラグメントの追加など、他の UI トランザクションをブロックします。したがって、UI にフラグメントを追加しても、それは遅延呼び出しであり、まだコールバックを取得していません。

于 2013-01-18T19:11:30.283 に答える
0

これ

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

これは onCreate を呼び出さないため、機能します。

PrefsFragment のインスタンスを 1 つだけ使用します。

于 2013-01-18T16:22:57.947 に答える