【问题标题】:Action Bar Tabs without using Fragments?不使用片段的操作栏选项卡?
【发布时间】:2012-06-14 12:27:29
【问题描述】:

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

我将不胜感激。

谢谢。

【问题讨论】:

  • 你确实需要使用 Fragments。您在使用 Fragments 时遇到了什么问题?
  • 由于我已经使用 Tabhost 开发了我的应用程序,因此我在将标签“转换”为使用片段时遇到了某些问题。我的主要问题是 :) 基本上没有关于如何使用可扩展列表和片段的简单示例。
  • 发布关于 ExpandableList 和片段的问题...我敢打赌你会得到一些帮助。 :)

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


【解决方案1】:

如果您打算使用 Activity over Fragments,您可以使用 Intent 从您的 ActionBar.TabListener 启动您的 Activity

startActivity(new Intent(thisActivity(), thatActivity.class)); 

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

【讨论】:

  • 通过按下操作栏选项卡来启动活动将是荒谬的,因为这样做会摆脱选项卡和操作栏本身,并将其替换为其他活动的内容。
  • 那是子类进来的,这个想法一点也不荒谬。
  • 实际上这正是 Google I/O 2014 的样子implemented。当单击导航抽屉中的项目时,将启动一个新活动,这将重新创建导航抽屉。一个名为BaseActivity 的类用于实现所有类的抽屉式导航。
【解决方案2】:

是否有可能在操作栏选项卡中使用活动?

还好没有。

但这并不意味着您必须使用片段。你的TabListener 可以做任何它想要影响你的用户界面变化的事情。一个蛮力的解决方案是再次调用setContentView(),转储所有旧的小部件并放置一个全新的(可能不同的)集合。

【讨论】:

  • 感谢您的回答。尝试了 MrEngineer 建议的解决方案,但它发生了你所说的。当然,只需更改视图,我的两个窗口就会显示出来,但很多控制都消失了。猜猜我将不得不使用片段。
  • 我已经尝试过这个解决方案,它是可能的,但它绝对是一个 hack。问题是,鉴于这不是创建选项卡视图的最佳方式,它对我的​​应用程序性能的影响有多大?我的意思是一个解决方案太糟糕了,值得学习如何正确使用片段并使用它们重写我的应用程序?
  • @Kalaji:“它对我的应用程序的性能有多大影响?” ——没有办法抽象地回答这个问题。您可以使用 Traceview 检查您的setContentView() 调用的性能。 “我的意思是一个解决方案太糟糕了,值得学习如何正确使用片段并使用它们重写我的应用程序吗?” ——我当然会使用片段。碎片已经存在了大约三年,所以它并不是什么新东西。再说一次,我不会使用操作栏标签,而是使用带有标签样式指示器的ViewPagerPagerTabStrip 或 ViewPagerIndicator 项目中的一个)。
【解决方案3】:

可以将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 中的动画,因此选项卡的更改是无缝的。 为此,请修改扩展 ActionBarActivity 的 ActivityonCreate() 方法

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

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

【讨论】:

  • 这些不是操作栏选项卡中的活动。这些活动由操作栏选项卡启动,然后占据屏幕。这与 OP 的问题完全无关。
  • 效果一样,一个字就不挑了
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多