2012-06-25 4 views
0

Я получаю сообщение об ошибке в LogCat:NullPointerException при добавлении TabListener

06-25 15: 17: 34,495: E/AndroidRuntime (5891): java.lang.RuntimeException: Невозможно начать деятельность ComponentInfo {com.example/com.example.MainActivity}: java.lang.NullPointerException 06-25 16: 07: 43,589: Е/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); 
    } 
} 

И, наконец, мой класс фрагмента А:

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. Основная деятельность должна продлевать SherlockFragmentActivity (кредиты JosipPranjic!).
  2. The 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

выглядит контекст приложения не инициализируется в коде ...... Пожалуйста инициализацию, что ...

Используется в MyTabsListener

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

Но если возможно, передать его в конструктор MyTabsListener и не сделать это статическим

new MyTabsListener(fragment1,this) 
+0

Я изменил код в соответствии с вашим ответом. Но я все еще получаю ошибку, см. Отредактированный ответ. Ошибка исходит от 'onTabSelected()'. – ComFreek

0

appContext не инициализируется. Обратите внимание, что класс расширяет класс ActivityContext, и так, чтобы показать Toast, было бы достаточно, чтобы

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

Другой вопрос: если вы хотите использовать реальный контекст приложения, попробуйте getApplicationContext(). Это вернет контекст приложения singleton. Дополнительная информация: link

+0

Я обновил ответ несколько минут назад. Теперь я передаю контекст приложения через конструктор в свой TabListener. Но спасибо за ссылку, я мог бы реализовать некоторые связанные с настройками методы в singleton. – ComFreek

+0

Обратите внимание, что то, что вы передаете 'TabListener', это не контекст приложения, а' MainActivity'. – overbet13

+0

Хорошо, я изменил его на 'this.getApplicationContext()'. Но ошибка в 'onTabSelected()' все еще сохраняется. Я думаю, что это имеет какое-то отношение к Шерлоку. – ComFreek

4

У меня была такая же проблема, как у вас, и я думаю, что решил.

В принципе, ваш MainActivity должна распространяться SherlockFragmentActivity и НЕ SherlockActivity.

Смежные вопросы