我有一个帐户信息活动,我需要使用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
答案 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实例。