2013-07-19 32 views
1

所以我得到这个恼人的问题。说到android,我很喜欢noob,所以任何帮助都会很好。无法启动活动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

此代码将不完全适合你的程序,但它给你的总体思路。你需要开始,做你的添加/替换/为什么然后提交。

By by,由于您使用的是ActionBarSherlock,为什么不使用Support库以便能够支持旧版本的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

Chaning主要活动延长SherlockFragmentActivity,删除旧的错误,但给了我一个新的。我应该开始一个新的问题,或只是把它添加到这里? –

+0

你可能应该打开一个新的,但现在这是好的......我认为一个好方法是尝试从一个工作示例开始 - 我已在我的答案中发布了一个。 – IanB

相关问题