我注意到使用tabhost有很多問題,但沒有一個真正適合我的問題。我正在嘗試創建一個頂部爲action bar的視圖,然後是欄下的一排選項卡。這是我的活動佈局。Tabhost nullpointerexception當tabhost不是佈局中唯一的東西
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
style="@style/Dashboard">
<com.ftni.common.ui.ActionBar
android:id="@+id/actionbar"
style="@style/ActionBar"/>
<TabHost android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp" />
</LinearLayout>
</TabHost>
</LinearLayout>
接下來,我們有我的活動宣佈爲
public class DashboardActivity extends TabActivity {
和我建立我的標籤是這樣。
private void buildTabs()
{
Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost); // The activity TabHost
TabHost.TabSpec spec; // Resusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab
// Create an Intent to launch an Activity for the tab (to be reused)
intent = new Intent().setClass(this, StatementsActivity.class);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("statements").setIndicator("Statements",
res.getDrawable(R.drawable.ic_tab_active))
.setContent(intent);
tabHost.addTab(spec);
// Do the same for the other tabs
intent = new Intent().setClass(this, PaymentsActivity.class);
spec = tabHost.newTabSpec("payments").setIndicator("Payments",
res.getDrawable(R.drawable.ic_tab_active))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(0);
}
當我嘗試使用getTabHost();
它總是返回null。所以,我切換到TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);
這不會返回一個空tabhost,但tabHost.addTab(spec);
仍然會導致空指針異常。
這裏是堆棧跟蹤
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): FATAL EXCEPTION: main
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ftni.consumer/com.ftni.consumer.ui.DashboardActivity}: java.lang.NullPointerException
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at android.os.Handler.dispatchMessage(Handler.java:99)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at android.os.Looper.loop(Looper.java:123)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at android.app.ActivityThread.main(ActivityThread.java:3647)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at java.lang.reflect.Method.invokeNative(Native Method)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at java.lang.reflect.Method.invoke(Method.java:507)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at dalvik.system.NativeStart.main(Native Method)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): Caused by: java.lang.NullPointerException
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at android.widget.TabHost.addTab(TabHost.java:212)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at com.ftni.consumer.ui.DashboardActivity.buildTabs(DashboardActivity.java:75)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at com.ftni.consumer.ui.DashboardActivity.onCreate(DashboardActivity.java:29)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
04-26 19:50:12.494: ERROR/AndroidRuntime(7367): ... 11 more
線75是第一tabHost.addTab(spec);
而且,我的所有活動都在我的清單中聲明。
<activity android:name=".ui.DashboardActivity"></activity>
<activity android:name=".ui.StatementsActivity"></activity>
<activity android:name=".ui.PaymentsActivity"></activity>
編輯:
只是爲了證明這不是一個問題,我刪除了動作條,把佈局究竟是什麼在本教程中,我仍然得到一個空從getTabHost();
編輯2:添加標籤,如果之前爲了清晰 滿級代碼
public class DashboardActivity extends TabActivity {
private ProfileModel profile;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
profile = Controller.getProfile();
setContentView(R.layout.dashboard);
buildTabs();
new LoadDashboardTask().execute();
}
@Override
public void onContentChanged()
{
ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);
if (actionBar != null)
{
actionBar.setOnTitleClickListener(new OnClickListener() {
public void onClick(View v) {
//do nothing for now. User is already "home"
}
});
if(profile.Accounts.length == 1)
actionBar.setTitle(profile.Accounts[0].Name);
else
actionBar.setTitle(profile.Name);
}
}
private void buildTabs()
{
Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost();// The activity TabHost
if(tabHost != null)
{
// Initialize a TabSpec for each tab and add it to the TabHost
TabSpec statementSpec = tabHost.newTabSpec("statements").setIndicator("Statements",
res.getDrawable(R.drawable.ic_tabs_statements))
.setContent(new Intent().setClass(DashboardActivity.this, StatementsActivity.class));
tabHost.addTab(statementSpec);
TabSpec paymentSpec = tabHost.newTabSpec("payments").setIndicator("Payments",
res.getDrawable(R.drawable.ic_tabs_payments))
.setContent(new Intent().setClass(DashboardActivity.this, PaymentsActivity.class));
tabHost.addTab(paymentSpec);
tabHost.setCurrentTab(0);
}
}
private class LoadDashboardTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute()
{
ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);
actionBar.setProgressBarVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params)
{
return null;
}
@Override
protected void onPostExecute(Void result)
{
ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);
actionBar.setProgressBarVisibility(View.GONE);
}
}
}
也許這有助於http://stackoverflow.com/questions/3163884/android-tabhost-without-tabactivity – 2012-09-12 18:48:17