使用Activity动态加载Fragment实现主界面框架

使用Activity动态加载Fragment实现主界面框架

在做项目中,需要建立一个主界面框架,尝试过使用ViewPager,后来又换成了使用Activity动态加载Fragment实现选项卡的效果。总结一下方便以后回顾。

先给出总体效果:

 使用Activity动态加载Fragment实现主界面框架

要实现上述效果,首先来大体上阐述步骤:

步骤一:

    创建一个界面框架布局文件activity_frame.xml ,一个垂直现行布局包含:从上到下第一个帧布局FrameLayout用于动态加载Fragment,命其idcontent;第二个布局是一个相对布局,用于放置三个标签按钮,其中三个线性布局嵌套分别一个ImageView,为了能均分,权重都为1;图标自己制作。同时创建一个FrameActivity.java文件,来显示主界面框架。

activity_frame.xml 代码:

 

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

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></FrameLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:background="#c0c0c0">

        <RelativeLayout
            android:id="@+id/main_layout"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/main_image"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:src="@drawable/img_main" />
            </LinearLayout>
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/shop_layout"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/shop_image"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:src="@drawable/img_shop" />
            </LinearLayout>
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/shop_layout"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/shop_image"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:src="@drawable/img_shop" />
            </LinearLayout>
        </RelativeLayout>


        <RelativeLayout
            android:id="@+id/my_layout"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/my_image"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:src="@drawable/img_my" />
            </LinearLayout>
        </RelativeLayout>
    </LinearLayout>

</LinearLayout>

 

步骤二:

   分别创建四个布局文件:

其中布局内容根据自己想要的布局设置;

步骤三:
    然后再为这四个布局创建对应的Fragment

其中每个Fragment加载布局的代码都是差不多,都是在onCreateView中获得一个View对象,其它代码根据业务需要而编写,如图:

步骤四:

    四Fragment创建好了之后,此时需要在FrameActivity中,通过界面底边的三个标签注册单击事件监听器来动态地加载Fragment

业务代码如下:


setTabSelection中包含一个switch函数,根据判断id来动态加载fragment(动态加载fragent的步骤这里不给出,csdn有相应的文章):
 FrameActivity的完整代码如下:

 

package com.android.activity;import com.android.client.R;import com.android.fragment.MainFragment;import com.android.fragment.MyFragment;import com.android.fragment.ShopFragment;import android.app.Activity;import android.app.AlertDialog;import android.app.FragmentManager;import android.app.FragmentTransaction;import android.app.AlertDialog.Builder;import android.content.DialogInterface;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.ImageView;public class FrameActivity extends Activity implements OnClickListener {    private MainFragment mainFragment;    private ShopFragment shopFragment;    private MyFragment myFragment;    private View mainLayout;    private View shopLayout;    private View myLayoutView;    private ImageView mainImg;    private ImageView shopImg;    private ImageView myImg;    private FragmentManager fragmentManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_frame);        initViews();        fragmentManager = getFragmentManager();        setTabSelection(0);    }    private void setTabSelection(int i) {        clearSelection();        FragmentTransaction transaction = fragmentManager.beginTransaction();        hideFragments(transaction);        switch (i) {            case 0:                mainImg.setImageResource(R.drawable.img_main_pressed);                if (mainFragment == null) {                    mainFragment = new MainFragment();                    transaction.add(R.id.content, mainFragment);                } else {                    transaction.show(mainFragment);                }                break;            case 1:                shopImg.setImageResource(R.drawable.img_shop_pressed);                if (shopFragment == null) {                    shopFragment = new ShopFragment();                    transaction.add(R.id.content, shopFragment);                } else {                    transaction.show(shopFragment);                }                break;            case 2:            default:                myImg.setImageResource(R.drawable.img_my_pressed);                if (myFragment == null) {                    myFragment = new MyFragment();                    transaction.add(R.id.content, myFragment);                } else {                    transaction.show(myFragment);                }                break;        }        transaction.commit();    }    private void hideFragments(FragmentTransaction transaction) {        if (mainFragment != null) {            transaction.hide(mainFragment);        }        if (shopFragment != null) {            transaction.hide(shopFragment);        }        if (myFragment != null) {            transaction.hide(myFragment);        }    }    private void clearSelection() {        // TODO Auto-generated method stub  mainImg.setImageResource(R.drawable.img_main);        shopImg.setImageResource(R.drawable.img_shop);        myImg.setImageResource(R.drawable.img_my);    }    private void initViews() {        // TODO Auto-generated method stub  mainLayout = findViewById(R.id.main_layout);        shopLayout = findViewById(R.id.shop_layout);        myLayoutView = findViewById(R.id.my_layout);        mainImg = (ImageView) findViewById(R.id.main_image);        shopImg = (ImageView) findViewById(R.id.shop_image);        myImg = (ImageView) findViewById(R.id.my_image);        mainLayout.setOnClickListener(this);        shopLayout.setOnClickListener(this);        myLayoutView.setOnClickListener(this);    }    @Override    public void onClick(View arg0) {        switch (arg0.getId()) {            case R.id.main_layout:                setTabSelection(0);                break;            case R.id.shop_layout:                setTabSelection(1);                break;            case R.id.my_layout:                setTabSelection(2);                break;            default:                break;        }        // TODO Auto-generated method stub   }    //框架中的退出提示代码,常规代码重用率很高可以抽象出来    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        // TODO Auto-generated method stub  if (keyCode == KeyEvent.KEYCODE_BACK) {            if (keyCode == KeyEvent.KEYCODE_BACK) {                Builder builder = new Builder(FrameActivity.this);                builder.setTitle("提示");                builder.setMessage("你确定要退出吗?");                builder.setIcon(R.drawable.ic_launcher);                DialogInterface.OnClickListener dialog = new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface arg0, int arg1) {                        // TODO Auto-generated method stub  if (arg1 == DialogInterface.BUTTON_POSITIVE) {                            arg0.cancel();                        } else if (arg1 == DialogInterface.BUTTON_NEGATIVE) {                            FrameActivity.this.finish();                        }                    }                };                builder.setPositiveButton("取消", dialog);                builder.setNegativeButton("确定", dialog);                AlertDialog alertDialog = builder.create();                alertDialog.show();            }        }        return false;    }}

 

到此,界面框架已经建好,接下来就根据自己的业务需要实现代码。

犯了错,总之要改,改之后呢,最好还是记录。因为这些难题在后来的日子还是会遇到。不妨到时候回过头看看自己当时记录的错误。毕竟是自己的错,资以改正。


纸上得来终觉浅,书到用时方恨少。希望对你有所帮助。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115080.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux抓包命令tcpdump以及常见抓包使用方法[通俗易懂]

    Linux抓包命令tcpdump以及常见抓包使用方法[通俗易懂]系统运行过程中,难免发现服务器一些流量异常或访问异常,我们可以采用tcpdump命令进行抓包。下边简单介绍下该命令使用办法。1,安装tcpdump一些系统默认没有安装,我们需要yum安装下这个命令:yuminstalltcpdump-y2,tcpdump使用。一些使用我们可以tcpdump–help看下帮助,比如:常用的一些简单用法,一般是抓取对应网卡、端口、对应IP等。tcpdump-nn本地网卡地址以及外部链接地址,并采用IP地址、端口表示。如果不加-nn则会…

    2022年6月15日
    57
  • Mac配置PHP环境(brew安装nginx+php)「建议收藏」

    第一步:检查本地有没有PHP:输入php-v命令,查看,如果有PHP版本,说明本地有PHP(MacOSX10.9以后的系统自带了PHP、php-fpm)我检查了一下,本地有,就不用安装了第二步:安装nginx直接输入brewinstallnginx然后回车就行,等待好一会儿,自动安装看到下面的提示,如图,说明安装成功,执行brewservicesstar…

    2022年4月16日
    32
  • dump 分析工具_一键全扒网站工具

    dump 分析工具_一键全扒网站工具ProcDumpProcDump是一个命令行实用程序,其主要目的是监视应用程序的CPU峰值,并在峰值期间生成崩溃转储,管理员或开发人员可以使用它来确定峰值的原因。ProcDump还包括挂起窗口监视(使用与Windows和任务管理器使用的窗口挂起相同的定义)、未处理的异常监视,并且可以根据系统性能计数器的值生成转储。它还可以作为一个通用的进程转储实用程序,您可以将其嵌入到其他脚本中。官网DebugDiag调试诊断工具(DebugDiag)旨在帮助解决任何用户模式进程中的挂起、性能缓慢、内存泄漏

    2022年10月2日
    1
  • 线程同步的四种方式

    线程同步的四种方式转载地址: http://blog.csdn.net/ebowtang/article/details/29905309一,什么是线程同步和互斥同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。这里的同步千万不要理解成那个同时进行,应是指协同、协助、互相配合。线程同步是指多线程通过特定的设置(如互斥量,事件对象,临界区)来控制线程之间的执行顺序(即所谓的同步)也可以说是在线程之间通过…

    2022年7月15日
    13
  • 数据的水平分割

    数据的水平分割

    2021年12月14日
    45
  • ringbuffer原理_hashset数据结构

    ringbuffer原理_hashset数据结构本篇介绍一种简单高效的数据缓存结构:RingBuffer,这种结构实现起来只需要几行代码即可,但使用场景却很广泛,比如在Linux内核中网络数据包的缓存,系统日志的存储等多处使用过该结构。同时它也被广泛的应用于异步通信以及嵌入式设备中,提供高效的数据缓存读写操作。1.实现原理RingBufferr实现比较简单,基本上只需要一个数组结构,外加两个用于存储位置信息的变量即可。其中的数组采用固定大小容量,便于重用内存,不会出现动态内存不断分配和销毁的情况,这对于一些GC类编程语言来说,大…

    2022年9月10日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号