2011-04-26 25 views
3

我注意到使用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); 
     } 
    } 
} 
+0

也許這有助於http://stackoverflow.com/questions/3163884/android-tabhost-without-tabactivity – 2012-09-12 18:48:17

回答

6

文檔指出你應該「建立呼叫()LOA使用findViewById()。「,這就是你在做什麼。見here。但是,由於您使用TabActivity,爲什麼不調用getTabHost()而不是手動獲取視圖?

+0

在OP中,我說當我調用getTabHost()時,返回null。 – Josh 2011-04-26 20:13:38

+0

順便說一句,我試着使用安裝程序的建議,然後錯誤地說我需要使用活動管理器,因爲我不是從TabActivity繼承(我是),然後錯誤'活動不能添加,直到包含組被創造'。這幾乎就像整個事情都忽略了我的活動從TabActivity擴展的事實。 – Josh 2011-04-26 20:32:46

+0

我已經實現了選項卡,但沒有從TabActivity擴展,所以這是可行的。此外,文檔聲明TabHost必須是佈局中的第一個元素,這可能是另一個問題(不用擔心,它不會在您的操作欄之前呈現任何內容)。你什麼時候調用buildTabs,onCreate的哪一點? – dmon 2011-04-26 20:47:55