操作栏选项卡不使用碎片?

时间:2012-06-14 12:27:29

标签: android android-activity android-fragments android-actionbar

无论如何,这可能是一个新手问题。由于Tabhost被折旧,我试图切换到操作栏选项卡,但我有使用片段的问题。是否有可能在操作栏选项卡中使用活动?

我将不胜感激。

感谢。

4 个答案:

答案 0 :(得分:3)

如果你开始使用活动而不是片段,你可以使用意图从ActionBar.TabListener

启动你的活动
startActivity(new Intent(thisActivity(), thatActivity.class)); 

您还应该查看有关使用Fragments over Activities

的评论

答案 1 :(得分:2)

  

是否有可能在操作栏标签中使用活动?

幸运的是,没有。

但这并不意味着你必须使用片段。您的TabListener可以做任何想要影响UI更改的内容。一个强力解决方案是再次调用setContentView(),转储所有旧的小部件并放置一个全新的(可能是不同的)集。

答案 2 :(得分:0)

可以将ActivityActionBar一起使用。请注意,这不是预期的行为,但这并不意味着它不能完美地运作。

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

//@SuppressLint("NewApi")
public class ActionBarActivity extends Activity {

    private String TAG  = getClass().getName();
    private Intent i    = null;
    private ActionBar actionBar;
    private Tab one;
    private Tab two;
    private Tab three;

    // create a tab listener that is called when the user changes tabs
    ActionBar.TabListener tabListener = new ActionBar.TabListener() {
        @Override
        public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
            if (tab.getTag().equals("one")){
                Log.d(TAG, "tab one selected");
                i = new Intent(getApplicationContext(), One.class);
                determineRun();
            }
            if (tab.getTag().equals("two")){
                Log.d(TAG, "tab two selected");
                i = new Intent(getApplicationContext(), Two.class);
                determineRun();
            }
            if (tab.getTag().equals("three")){
                Log.d(TAG, "tab three selected");
                i = new Intent(getApplicationContext(), Three.class);  
                determineRun();
            }           
        }

        @Override
        public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
            // TODO Auto-generated method stub          
        }

        @Override
        public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
            // TODO Auto-generated method stub      
        }
    };  

    // we only need to start the Activity if it's not actually already the current Activity!
    void determineRun(){
        if (!TAG.equals(i.getComponent().getClassName())){
            startActivity(i);
        }   
        return;
    }//end method

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

        actionBar = getActionBar();
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setSubtitle(getResources().getString("subtitle"));        
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);    
        one = actionBar.newTab();
        one.setText("Tab 1").setTag("one");
        two = actionBar.newTab();
        two.setText("Tab 2").setTag("two");
        three = actionBar.newTab();
        three.setText("Tab 3").setTag("three");                
        one.setTabListener(tabListener);
        two.setTabListener(tabListener);
        three.setTabListener(tabListener);

        // You will have to set the selected Tab manually
        // A good idea would be to create a subclass for each Tab based on this code
        // Then, just create a new Activity which extends ActionBarActivity
        actionBar.addTab(one, 0, false);
        actionBar.addTab(two, 1, true); // selected Tab
        actionBar.addTab(three, 2, false);
    }//end method

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

        Log.d(TAG, "onResume()");
        Log.d(TAG, ""+i.getComponent().getClassName());
        // again, here you need to select the Tab manually
        if (!TAG.equals(i.getComponent().getClassName())){
            actionBar.selectTab(two); // selected Tab
        }   
    }//end method

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

        Log.d(TAG, "onPause()");
    }//end method

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

        overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
    }//end method    
}//end class

您可能希望覆盖Activity中的动画,因此标签的更改是无缝的。 为此,请修改onCreate()扩展ActionBarActivity的Activity方法

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

    overridePendingTransition(0, 0);
}//end method

答案 3 :(得分:0)

如果我的理解是正确的,您希望使用操作栏来交换活动而不是片段。在这种情况下,请继续阅读。

从你可以看到的官方文档中,动作栏功能定义了一组ui,position。如果你想用活动实现actionbar,最重要的是做 1.将您的标签(位置)与您的活动相关联。 2.每次单击选项卡时添加tablistener回调(实例化新活动,停止当前活动)

最好的设计是让tablistener实现一个单独的类,这样你的每个活动都可以使用这个类。