1

だから私はこの厄介な問題を抱えています。私はAndroidに関してはかなり初心者なので、どんな助けでもいいでしょう。

これは、LogCat によるとクラッシュしているように見える私の MainActivity です。作成しようとしているアプリは、取得しようとしている 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 のようです。しかし、私はその理由を理解していません。以前はそうしていませんでした。データを追加しようとしたときにクラッシュし始めました。誰でもここで私を助けることができますか?

4

1 に答える 1

2

アクティビティの 111 行目 (onTabSelected 内) でヌル ポインター例外があります。null参照はおそらく「フラグメント」への参照であるように見えます。「フラグメントトランザクションの実行」のセクションを見てください。

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

このコードはあなたのプログラムにぴったり合うわけではありませんが、一般的な考え方はわかります。開始し、追加/置換/理由を実行してからコミットする必要があります。

ところで、あなたは ActionBarSherlock を使用しているので、古いバージョンの Android をサポートできるように Support ライブラリを使用してみませんか?

以下は、役立つかもしれない簡単な例です (必要のない余分なものが含まれています)。

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 に答える