2013-07-19 2 views
1

Так что я получаю эту неприятную проблему. Я довольно noob, когда дело доходит до android, поэтому любая помощь будет приятной.Невозможно запустить Activity componentInfo Tablistener внезапно сбой приложения

Это моя MainActivity, которая, кажется, разбивается в соответствии с LogCat. Приложение, которое я пытаюсь создать, должно извлекать данные из XML-данных, которые я пытаюсь получить. Затем из этих данных необходимо установить имя вкладки (это то, что я пытаюсь сделать).

public class MainActivity extends SherlockActivity { 

private String uniqeAppId; 
private ArrayList<StartupInfo> info; 
private String ChannelTab; 
private String VicinityTab; 
private String CustomTab; 
private String TrackingTab; 
private String MoreTab; 
public static Context appContext; 
private DownloadXmlTask downloadxml = new DownloadXmlTask(this); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    info = new ArrayList<StartupInfo>(); 
    downloadxml.loadPage(); 
    appContext = getApplicationContext(); 
    ActionBar actionbar = getSupportActionBar(); 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionbar.setTitle(uniqeAppId); 

    ActionBar.Tab Frag1 = actionbar.newTab().setText(ChannelTab); 
    ActionBar.Tab Frag2 = actionbar.newTab().setText(VicinityTab); 
    ActionBar.Tab Frag3 = actionbar.newTab().setText(CustomTab); 
    ActionBar.Tab Frag4 = actionbar.newTab().setText(TrackingTab); 
    ActionBar.Tab Frag5 = actionbar.newTab().setText(MoreTab); 

    Fragment Fragment1 = new Channeltab(); 
    Fragment Fragment2 = new Vicinitytab(); 
    Fragment Fragment3 = new Customtab(); 
    Fragment Fragment4 = new Trackingtab(); 
    Fragment Fragment5 = new Moretab(); 

    Frag1.setTabListener(new MyTabListener(Fragment1)); 
    Frag2.setTabListener(new MyTabListener(Fragment2)); 
    Frag3.setTabListener(new MyTabListener(Fragment3)); 
    Frag4.setTabListener(new MyTabListener(Fragment4)); 
    Frag5.setTabListener(new MyTabListener(Fragment5)); 

    actionbar.addTab(Frag1); 
    actionbar.addTab(Frag2); 
    actionbar.addTab(Frag3); 
    actionbar.addTab(Frag4); 
    actionbar.addTab(Frag5); 

} 

public void GetTextForTabs(ArrayList<StartupInfo> info2) { 
    this.info = info2; 
    StartupInfo info3 = info.get(0); 
    this.ChannelTab = info3.getChannelTab(); 
    this.VicinityTab = info3.getVicinityTab(); 
    this.CustomTab = info3.getCustomTab(); 
    this.TrackingTab = info3.getTrackingTab(); 
    this.MoreTab = info3.getMoreTab(); 

} 

@Override 
public void onStart() { 
    super.onStart(); 


} 

public void setInfo(ArrayList<StartupInfo> info) { 
    this.info = info; 

} 

public void alert(String msg) { 
    Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show(); 

} 

public class MyTabListener implements ActionBar.TabListener { 

    public Fragment fragment; 

    public MyTabListener(Fragment fragment) { 
     this.fragment = fragment; 
    } 

    @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); 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 

    } 

} 

}

Тогда LogCat:

LogCat

Это кажется TabListener. Но я не понимаю, почему. Раньше этого не было. Это было, когда я попытался добавить данные, которые он начал сбой. Может ли кто-нибудь помочь мне здесь?

ответ

2

У вас есть исключение нулевого указателя в строке 111 вашей активности (в onTabSelected). Похоже, что нулевая ссылка, вероятно, является «фрагментом». Смотрите раздел на «Выполнение фрагмента операции»:

http://developer.android.com/guide/components/fragments.html

Этот код не будет соответствовать вашей программе точно, но это дает вам общее представление. Вам нужно начать, добавить/заменить/почему и затем совершить.

Насколько вы используете ActionBarSherlock, почему бы не использовать библиотеку поддержки, чтобы иметь возможность поддерживать более старые версии Android?

Вот простой пример (он содержит некоторые лишние вещи, которые вам не нужны), которые могли бы помочь:

public class ExtraContent extends SherlockFragmentActivity { 
// Declare Tab Variable 
com.actionbarsherlock.app.ActionBar.Tab tab; 

boolean mDebugLog = false; 
String mDebugTag="ian_"; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //mDebugLog = true; 
    debugLog("ExtraContent onCreate"); 

    // Create the actionbar 
    com.actionbarsherlock.app.ActionBar bar = getSupportActionBar(); 

    // Show Actionbar Home Icon (as normal) 
    bar.setDisplayShowHomeEnabled(true); 

    // Show Actionbar Title (as normal) 
    bar.setDisplayShowTitleEnabled(true); 

    // Create Actionbar Tabs 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    //enable home ... 
    bar.setDisplayHomeAsUpEnabled(true);  // ? 
    bar.setHomeButtonEnabled(true);   // this is the one that enables home navigation 

    //ib18 view for fragments ... 
    setContentView(R.layout.extra_content); 

    //create the fragment we want to use for display content 
    Fragment ExtraLogin = new ExtraLogIn(); 


    // Create First Tab 
    ActionBar.Tab tab0 = bar.newTab(); 
    tab0 = bar.newTab(); 
    tab0.setText("Unlock"); 
    tab0.setTabListener(new TabListener<ExtraTab0>(this, "tab0",ExtraTab0.class, null)); 
    bar.addTab(tab0); 

    // Create Second Tab 
    ActionBar.Tab tab1 = bar.newTab(); 
    tab1 = bar.newTab(); 
    tab1.setText("Level 1"); 
    tab1.setTabListener(new TabListener<ExtraTab1>(this, "tab1",ExtraTab1.class, null)); 
    bar.addTab(tab1);   

    // Create Third Tab 
    ActionBar.Tab tab2 = bar.newTab(); 
    tab2 = bar.newTab(); 
    tab2.setText("Level 2"); 
    tab2.setTabListener(new TabListener<ExtraTab2>(this, "tab2",ExtraTab2.class, null)); 
    bar.addTab(tab2);  


    if (savedInstanceState != null) { //if there is a saved bundle use it ... 
     bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
    } 
    else { 
     //ib18 savedInstanceState null so fti so start Login frag ... 
     FragmentManager fm = getSupportFragmentManager(); 
     fm.beginTransaction().replace(R.id.fb, ExtraLogin, "ExtraLogin").commit(); 
    } 

} 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    debugLog("ExtraContent onMenuItemSelected"); 
    int itemId = item.getItemId(); 
    switch (itemId) { 
    case android.R.id.home: 
     // app icon in action bar clicked; go home 
     Intent intent = new Intent(this, QuizLaunch.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(intent); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 


@Override 
protected void onSaveInstanceState(Bundle outState) { 
    debugLog("ExtraContent onSaveInstanceState"); 
    super.onSaveInstanceState(outState); 
    outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); 
} 

public class TabListener<T extends Fragment> implements ActionBar.TabListener{ 

    private final FragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 
    private final Bundle mArgs; 
    private Fragment mFragment; 

    public TabListener (FragmentActivity activity, String tag, Class<T> clz, 
      Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 
     debugLog("ExtraContent TabListener"); 
     FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 

     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 
     // 
     if (mFragment != null && !mFragment.isDetached()) { 
      ft.detach(mFragment); 
     } 
     ft.commit(); 
    } 
    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     debugLog("ExtraContent onTabSelected"); 
     ft = mActivity.getSupportFragmentManager() 
       .beginTransaction(); 

     if (mFragment == null) { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName(),mArgs); 
      debugLog("adding fragment "+mTag); 
      ft.add(R.id.tab, mFragment, mTag); //ib18 add to "tab" holder 
      ft.show(mFragment); //ib1.6 show fragment ... 
      ft.commit(); 
     } else { 
      debugLog("attaching fragment "+mTag); 
      ft.attach(mFragment); 
      ft.show(mFragment); //ib1.6 show fragment ... 
      ft.commit(); 
     } 

    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     debugLog("ExtraContent onTabUnSelected"); 
     ft = mActivity.getSupportFragmentManager() 
       .beginTransaction(); 

     if (mFragment != null) { 
      debugLog("hide and detach fragment "+mFragment); 
      ft.hide(mFragment); //ib1.6 hide fragment ...    
      ft.detach(mFragment); 
      ft.commitAllowingStateLoss(); 
     } 

    } 
    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
     debugLog("ExtraContent onTabReSelected"); 
    } 

} 

void debugLog(String message) { 
    if (mDebugLog) 
     Log.d(mDebugTag, message); 
} 
} 
+0

чейнинга основной деятельности продлить SherlockFragmentActivity, удалил старую ошибку, но дал мне новый. Должен ли я начать новый вопрос или просто добавить его сюда? –

+0

Возможно, вы, вероятно, должны открыть новый, но сейчас все в порядке ... Я думаю, что хороший подход - попытаться начать с рабочего примера - я опубликовал один ответ. – IanB

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