1

所以我遇到了这个烦人的问题。谈到android,我很菜鸟,所以任何帮助都会很好。

这是我的 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:

日志猫

它似乎是 TabListener。但我不明白为什么。之前没有这样做。就在我尝试添加数据时,它开始崩溃。有人能帮我一下吗 ?

4

1 回答 1

2

您在活动的第 111 行(在 onTabSelected 中)有一个空指针异常。看起来空引用可能是“片段”。查看“执行片段事务”部分:

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

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

顺便说一句,既然您使用的是 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);
}
}
于 2013-07-19T22:47:09.247 回答