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

先给出总体效果:

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

步骤一:

创建一个界面框架布局文件activity_frame.xml ,一个垂直现行布局包含:从上到下第一个帧布局FrameLayout用于动态加载Fragment,命其id为content;第二个布局是一个相对布局,用于放置三个标签按钮,其中三个线性布局嵌套分别一个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/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,

业务代码如下:

        @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;
} <pre name="code" class="java">private void setTabSelection(int i) {
// TODO Auto-generated method stub
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(); }

<pre name="code" class="java"><span style="font-size:18px;"> setTabSelection中包含一个switch函数,根据判断id来动态加载fragment(动态加载fragent的步骤这里不给出,csdn有相应的文章):
FrameActivity的完整代码如下:</span> <pre name="code" class="java">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 TextView mainTxt; private TextView shopTxt; private TextView
* myTxt;
*/ private FragmentManager fragmentManager; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_frame);
initViews();
fragmentManager = getFragmentManager();
setTabSelection(0); } private void setTabSelection(int i) {
// TODO Auto-generated method stub
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) {
// TODO Auto-generated method stub
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);
// mainTxt.setTextColor(Color.parseColor("#82858b"));
shopImg.setImageResource(R.drawable.img_shop);
// shopTxt.setTextColor(Color.parseColor("#82858b"));
myImg.setImageResource(R.drawable.img_my);
// myTxt.setTextColor(Color.parseColor("#82858b")); } 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);
/*
* mainTxt = (TextView) findViewById(R.id.main_text); shopTxt =
* (TextView) findViewById(R.id.shop_text); myTxt = (TextView)
* findViewById(R.id.my_text);
*/ 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;
} }


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

版权声明:本文为博主原创文章,未经博主允许不得转载。

通过Activity动态加载Fragment创建主界面构架的更多相关文章

  1. 在主Android Activity中加载Fragment的一般简易方法 ,来模拟一个微信界面。

    在Fragment的生命周期中,需要重点关注onCreate.onCreateView.onViewCreated.Activity与Fragment生命周期在设计模式上大体一致. package c ...

  2. 关于Android中Fragment静态和动态加载的方法

    一.静态加载 1.首先创建一个layout布局fragment.xml,里面放要显示和操作的控件 2.创建一个layout布局main1.xml,用来实现页面的跳转(跳转为要实现静态加载的界面) 3. ...

  3. Android中的动态加载机制

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  4. Android 动态加载 (一) 态加载机制 案例一

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  5. Android之Android apk动态加载机制的研究(二):资源加载和activity生命周期管理

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...

  6. Android学习——Fragment动态加载

    动态加载原理 利用FragmentManager来添加一套Fragment事务,最后通过commit提交该事务来执行对Fragment的相关操作. FragmentManager fragmentma ...

  7. Android中插件开发篇之----动态加载Activity(免安装运行程序)

    一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...

  8. 动态加载Layout 与 论Activity、 Window、View的关系

    1)动态加载Layout的代码是 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null)); ...

  9. 分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。

    (转载声明出处:http://www.cnblogs.com/linguanh/) 简介:      该ListView 实现动态加载数据,为了方便用户充分地自定义自己的数据源.点击事件,等核心操作, ...

随机推荐

  1. 十二条Linux运维面试必备经典笔试/面试题

    1.Linux设置环境变量 暂时的:export MYNAME="new name" echo $MYNAME new name 永久的:通过改变/etc/profile实现 EG ...

  2. docker之NGINX镜像构建

    Nginx是一个高性能的Web和反向代理服务器,它具有很多非常优越的特性:1.作为Web服务器.2.作为负载均衡服务器.3.作为邮件代理服务器.4.安装及配置简单.接下来我们介绍在docker构建ng ...

  3. 《.NET 设计规范》第 9 章:常用的设计模式

    第 9 章:常用的设计模式 9.1 聚合组件 考虑为常用的特性域提供聚合组件. 要用聚合组件来对高层的概念(物理对象)进行建模,而不是对系统级的任务进行建模. 要让聚合组件的名字与众所周知的系统实体相 ...

  4. JAVA 调用 R 语言之升华篇

    由于项目的需要,最近做了一个javaWeb调用R的组件,在这里,我把自己走的一些弯路给大家总结一下: 一.选取什么插件作为java和R之间的通信? 1. 在传统的方式中,大致可以分为两类:一类是JRI ...

  5. 史上最大的CPU Bug(幽灵和熔断的OS&SQLServer补丁)

    背景 最近针对我们的处理器出现了一系列的严重的bug.这种bug导致了两个情况,就是熔断和幽灵. 这就是这几天闹得人心惶惶的CPU大Bug.消息显示,以英特尔处理器为代表的现代CPU中,存在可以导致数 ...

  6. 使用.bat来执行Java程序基础

    将java程序做成可运行的jar后,又希望使用.bat文件来调用jar时,有几点需要注意的. 1.设置path和classpath .bat文件中扥的内容如下: @echo off set MY_HO ...

  7. k短路模板 POJ2449

    采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...

  8. [置换群&Polya计数]【学习笔记】

    昨天看了一下午<组合数学>最后一章然后晚上去看别人的blog发现怎么都不一样,我一定是学了假的polya 其实是一样的,只不过<组合数学>没有太多的牵扯群论.于是又从群论角度学 ...

  9. ------ 解析因内核栈溢出导致的 “double fault” 蓝屏 ------

    -------------------------------------------------------------------------- 前一篇指出 tail_recursivef_fac ...

  10. CSA单点登录环境配置

    本篇先写一些基础 今天看到一个cas单点登录的源码,搞环境就废了大半时间 <SSO CAS单点系列>http://www.imooc.com/article/3576 参考了这篇博客里的配 ...