在ActionBar中进行Fragment之间的切换

简介:

在ActionBar中添加标签(Tabs),每个标签对应的是一个Fragment,点击不同的Tab时,就会切换到对应的Fragment。

  这里有五个关键步骤:

  1. 要实现 ActionBar.TabListener接口,当点击Tab的时候触发这个接口里面的事件,有onTabSelected()onTabUnselected(), 和 onTabReselected(). 实现ActionBar.TabListener接口时,应当在类内有个Fragment的引用,这样点击这个Tab时就可以调用对应的Fragment.

  2. 通过getActionBar() 方法得到Activity中的ActionBar。

  3. 设置AcitonBar的操作模式: setNavigationMode(NAVIGATION_MODE_TABS)

  4. 在ActionBar中添加Tabs:一.调用AciontBar的newTab()生成一个ActionBar.Tab二.为Tab增加text或者icon .调用setText() , setIcon() 三.为每个 ActionBar.Tab 添加ActionBar.TabListener.

  5. 调用addTab()将生成的Tab加入ActionBar中

  

  以下是例子代码,就是为了测试,没有实际的用途.

  有两个Fragment:EditFragment和ComputerFragment,对应的Tab是"编辑"和计算。他们的XML和Activity如下:

 

EditFragment:

public class EditFragment extends Fragment
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        System.out.println("EidtFragment--->onCreate");
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        System.out.println("EidtFragment--->onCreateView");
        return inflater.inflate(R.layout.editfragment, container, false);
    }

    @Override
    public void onStop()
    {
        System.out.println("EidtFragment--->onStop");
        super.onStop();
    }
}

editfragment.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:text="请输入你的信息:"
        android:textSize="20dp" />

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="40pt"
        android:layout_margin="5dp"
        android:background="@android:color/darker_gray"
        android:textSize="18dp" />

</LinearLayout>

ComputerFragment:

public class ComputerFragment extends Fragment
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        System.out.println("ComputerFragment--->onCreate");
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        System.out.println("ConputerFragment--->onCreateView");
        return inflater.inflate(R.layout.computerfragment, container, false);
    }

    @Override
    public void onStop()
    {
        System.out.println("ConputerFragment--->onStop");
        super.onStop();
    }
}

computerfragment.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:text="简单加法计算"
        android:textSize="20dp" />

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:background="@android:color/darker_gray" />

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:background="@android:color/darker_gray" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="开始计算" />

</LinearLayout>

主要的程序:MainActivity:

public class MainActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        System.out.println("MainActivity--->onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 得到Activity的ActionBar
        ActionBar actionBar = getActionBar();
        // 设置AcitonBar的操作模型
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        // 将Activity的头部去掉
        actionBar.setDisplayShowTitleEnabled(false);
        // 生成Tab
        Tab edit = actionBar.newTab().setText("编辑");
        Tab computer = actionBar.newTab().setText("计算");
        // 为每个Tab添加Listener
        MyTabListener editListener = new MyTabListener(new EditFragment());
        edit.setTabListener(editListener);
        MyTabListener computerListener = new MyTabListener(new ComputerFragment());
        computer.setTabListener(computerListener);
        // 将Tab加入ActionBar中
        actionBar.addTab(edit);
        actionBar.addTab(computer);
    }

    @Override
    protected void onStop()
    {
        System.out.println("MainActivity--->onStop");
        super.onStop();
    }

    /**
     * 实现ActionBar.TabListener接口
     */
    class MyTabListener implements TabListener
    {
        // 接收每个Tab对应的Fragment,操作
        private Fragment fragment;

        public MyTabListener(Fragment fragment)
        {
            this.fragment = fragment;
        }

        public void onTabReselected(Tab tab, FragmentTransaction ft)
        {

        }

        // 当Tab被选中的时候添加对应的Fragment
        public void onTabSelected(Tab tab, FragmentTransaction ft)
        {
            ft.add(R.id.context, fragment, null);
        }

        // 当Tab没被选中的时候删除对应的此Tab对应的Fragment
        public void onTabUnselected(Tab tab, FragmentTransaction ft)
        {
            ft.remove(fragment);
        }
    }
}

程序运行结果:

     


相关文章
|
算法 数据可视化
Halcon边缘检测和线条检测(1),文章含自适应/动态二值化等算子
Halcon边缘检测和线条检测(1),文章含自适应/动态二值化等算子
1986 0
|
11月前
|
缓存 监控 NoSQL
Redis 缓存穿透的检测方法与分析
【10月更文挑战第23天】通过以上对 Redis 缓存穿透检测方法的深入探讨,我们对如何及时发现和处理这一问题有了更全面的认识。在实际应用中,我们需要综合运用多种检测手段,并结合业务场景和实际情况进行分析,以确保能够准确、及时地检测到缓存穿透现象,并采取有效的措施加以解决。同时,要不断优化和改进检测方法,提高检测的准确性和效率,为系统的稳定运行提供有力保障。
207 5
|
机器学习/深度学习 PyTorch TensorFlow
ONNX 模型互操作性的最佳实践
【8月更文第27天】随着深度学习技术的发展,越来越多的框架被开发出来以满足不同的需求。然而,不同的框架之间缺乏互操作性可能会限制模型的部署和迁移能力。Open Neural Network Exchange (ONNX) 格式旨在解决这个问题,它提供了一种标准化的方法来表示机器学习模型,从而实现了不同框架之间的模型转换和共享。本文将探讨如何在不同的深度学习框架之间高效地转换和部署模型,并提供一些实际的代码示例。
548 1
|
存储 关系型数据库 MySQL
|
SQL Oracle 关系型数据库
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database (
412 2
|
存储 算法 Shell
【Linux 环境变量相关】深入理解Linux下 CMake、Shell 与环境变量的交互(二)
【Linux 环境变量相关】深入理解Linux下 CMake、Shell 与环境变量的交互
358 0
|
Android开发 Java 编译器
Eclipse源代码分析
Eclipse源代码分析 一、概述走入Eclipse的内核,看看它到底是怎么工作的?1、Eclipse源代码 下载地址:http://download.eclipse.org/eclipse/downloads2、源代码阅读工具        Source Insight  V3.5它其实是一个代码编辑软件,因为有强大的代码分析工具,可以很方便地跟踪代码的相关性,所以常用来作为阅读代码的工具。
2345 0
|
数据可视化 测试技术
JMeter 中如何准确设置并发量
JMeter 是一个功能强大的性能测试工具,可以模拟许多用户同时访问应用程序的情况。在使用 JMeter 进行性能测试时,设置并发是非常重要的。本文将介绍如何在 JMeter 中设置并发和查看报告。
JMeter 中如何准确设置并发量
|
消息中间件 存储 Linux
RabbitMQ 延时交换机
RabbitMQ 延时交换机
422 0
RabbitMQ 延时交换机