2012-06-25 35 views
0

,當我在logcat中收到此錯誤信息:的NullPointerException添加TabListener

06-25 15:17:34.495:E/AndroidRuntime(5891): 了java.lang.RuntimeException:無法啓動活動 ComponentInfo {com。示例/ com.example.MainActivity}: 顯示java.lang.NullPointerException 06-25 16:07:43.589:E/AndroidRuntime(6587):由:顯示java.lang.NullPointerException 06-25 16:07:43.589:E/AndroidRuntime(6587):at com.example.MyTabsListener.onTabSelected(MyTabListener.java:28)

這是我的主要活動:

package com.example; 

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 

import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.SherlockActivity; 

public class MainActivity extends SherlockActivity {  
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ActionBar actionbar = getSupportActionBar(); 
     actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     ActionBar.Tab tab1 = actionbar.newTab().setText("Fragment A"); 
     SherlockFragment fragment1 = new AFragment(); 

     tab1.setTabListener(new MyTabsListener(fragment1, this 
      .getApplicationContext())); 
     actionbar.addTab(tab1); 
    } 

} 

而且我簡單TabListener:

package com.example;  

import android.content.Context; 
import android.support.v4.app.FragmentTransaction; 
import android.widget.Toast; 

import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.ActionBar.Tab; 
import com.actionbarsherlock.app.SherlockFragment; 

class MyTabsListener implements ActionBar.TabListener { 
    public SherlockFragment fragment; 
    private final Context appContext; 

    public MyTabsListener(SherlockFragment fragment, Context ctx) { 
        this.fragment = fragment; 
        this.appContext = ctx; 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
        Toast.makeText(this.appContext, "Reselected!", Toast.LENGTH_LONG) 
                .show(); 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
        ft.replace(R.id.fragment_container, fragment); 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
        ft.remove(fragment); 
    } 
} 

最後我班片段A

package com.example; 

import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.actionbarsherlock.app.SherlockFragment; 

public class AFragment extends SherlockFragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.weekdays, container, false); 
    } 

} 

所以這功能導致錯誤的TabListener:

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    ft.replace(R.id.fragment_container, fragment); 
} 

回答

2
  1. MainActivity必須延長SherlockFragmentActivity(信貸給JosipPranjic!)。
  2. NullPointerException異常可以固定從本SO問題下面的代碼:Null FragmentTransaction being passed to TabListener.onTabSelected()

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ignoredFt) { 
        FragmentManager fragMgr = ((FragmentActivity) mActivity) 
         .getSupportFragmentManager(); 
        FragmentTransaction ft = fragMgr.beginTransaction(); 
    
        // Check if the fragment is already initialized 
        if (mFragment == null) { 
         // If not, instantiate and add it to the activity 
         mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
    
         ft.add(android.R.id.content, mFragment, mTag); 
        } else { 
         // If it exists, simply attach it in order to show it 
         ft.attach(mFragment); 
        } 
    
        ft.commit(); 
    } 
    
    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ignoredFt) { 
        FragmentManager fragMgr = ((FragmentActivity) mActivity) 
          .getSupportFragmentManager(); 
        FragmentTransaction ft = fragMgr.beginTransaction(); 
    
        // Check if the fragment is already initialized 
        if (mFragment == null) { 
         // If not, instantiate and add it to the activity 
         mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
    
         ft.add(android.R.id.content, mFragment, mTag); 
        } else { 
         // If it exists, simply attach it in order to show it 
         ft.detach(mFragment); 
        } 
    
        ft.commit(); 
    } 
    
0

看起來appContext在代碼中沒有初始化......請初始化...

用於MyTabsListener

Toast.makeText(MainActivity.appContext, "Reselected!", Toast.LENGTH_LONG).show(); 

但如果可能的話將它傳遞給MyTabsListener的構造函數,而不是使其成爲靜態

new MyTabsListener(fragment1,this) 
+0

我根據你的回答修改後的代碼。但是我仍然遇到錯誤,請參閱編輯後的答案。錯誤來自'onTabSelected()'。 – ComFreek

0

appContext未初始化。 注意該類Activity擴展Context類,等等,表現出Toast,這將足以

Toast.makeText(MainActivity, "Reselected!", Toast.LENGTH_LONG).show(); 

另一個問題:如果你想使用的實際應用背景下,嘗試getApplicationContext()。這將返回單例應用程序上下文。更多的信息:link

+0

幾分鐘前我更新了答案。我現在通過構造函數將應用程序的上下文傳遞給我的TabListener。但感謝鏈接,我可以在單例中實現一些與設置相關的方法。 – ComFreek

+0

請注意,您傳遞給「TabListener」的內容不是應用程序上下文,而是「MainActivity」。 – overbet13

+0

好的,我將它改爲'this.getApplicationContext()'。但'onTabSelected()'中的錯誤仍然存​​在。我認爲這與Sherlock有關。 – ComFreek

4

我剛剛遇到了同樣的問題,我想我解決了它。

基本上,你的MainActivity應該延伸SherlockFragmentActivity和NOT SherlockActivity

相關問題