Android 不使用片段的操作栏选项卡?

Android 不使用片段的操作栏选项卡?,android,android-activity,android-fragments,android-actionbar,Android,Android Activity,Android Fragments,Android Actionbar,这可能是一个相当新的问题,但无论如何。由于Tabhost已贬值,我尝试切换到操作栏选项卡,但在使用片段时遇到了问题。是否可以在操作栏选项卡中使用活动 我将感谢任何帮助 谢谢。如果您打算在片段上使用活动,您可以使用意图从操作栏启动活动。TabListener startActivity(new Intent(thisActivity(), thatActivity.class)); 您还应该查看关于使用的评论 是否可以在操作栏选项卡中使用活动 幸运的是,没有 不过,这并不意味着必须使用片段。您

这可能是一个相当新的问题,但无论如何。由于Tabhost已贬值,我尝试切换到操作栏选项卡,但在使用片段时遇到了问题。是否可以在操作栏选项卡中使用活动

我将感谢任何帮助


谢谢。

如果您打算在片段上使用活动,您可以使用意图从
操作栏启动活动。TabListener

startActivity(new Intent(thisActivity(), thatActivity.class)); 
您还应该查看关于使用的评论

是否可以在操作栏选项卡中使用活动

幸运的是,没有


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

可以将
活动
操作栏
一起使用。注意,虽然这不是有意的行为,但这并不意味着它不能完美地工作

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
您可能希望覆盖
活动中的动画
,这样选项卡的更改就看不见了。 为此,请修改扩展ActionBarActivity的
活动的
onCreate()
方法

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

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

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

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


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

您确实需要使用片段。使用片段有什么问题?因为我已经使用Tabhost开发了我的应用程序,我在“转换”我的标签到使用片段时遇到了一些问题。我的主要问题是:)基本上没有关于如何使用可扩展列表和片段的简单示例。。。我打赌你会得到一些帮助按一个操作栏标签开始一项活动是荒谬的,因为这样做会去掉标签和操作栏本身,用其他活动的内容替换它。如果有子类出现,这个想法一点也不荒谬。实际上这正是谷歌I/O 2014的风格。单击导航抽屉中的项目时,将启动新活动,这将重新创建导航抽屉。名为
BaseActivity
的类用于实现所有类的导航抽屉。感谢您的回答。用工程师建议的解决方案尝试了一下,但它实现了你所说的。当然,只要改变视图,我的两个窗口就会显示出来,但是很多控制都消失了。我猜为了提供现在已经贬值的TabHost的外观和感觉,我将不得不使用片段。我已经尝试过这个解决方案,这是可能的,但它肯定是一个黑客。问题是,鉴于这不是创建选项卡视图的最佳方式,它对我的应用程序的性能有多大影响?我的意思是,一个解决方案是否如此糟糕,以至于值得学习如何正确使用片段并使用它们重写我的应用程序?@Kalaji:“它对我的应用程序的性能有多大影响?”——抽象地说,没有办法回答这个问题。您可以使用Traceview检查
setContentView()
调用的性能。“我的意思是,这是一个非常糟糕的解决方案,值得学习如何正确使用片段并使用它们重写我的应用程序吗?”——我当然会使用片段。碎片已经存在大约三年了,所以它不像是新的东西。同样,我不会使用操作栏选项卡,而是使用带有选项卡样式指示器的
ViewPager
PagerTabStrip
或来自ViewPagerIndicator项目的指示器)。这些不是操作栏选项卡中的活动。这些活动由操作栏选项卡启动,然后占据屏幕。这与OP的问题毫无关系。它有同样的效果,我们不要挑剔一个词