通过Activity动态加载Fragment创建主界面构架
在做项目中,需要建立一个主界面框架,尝试过使用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创建主界面构架的更多相关文章
- 在主Android Activity中加载Fragment的一般简易方法 ,来模拟一个微信界面。
在Fragment的生命周期中,需要重点关注onCreate.onCreateView.onViewCreated.Activity与Fragment生命周期在设计模式上大体一致. package c ...
- 关于Android中Fragment静态和动态加载的方法
一.静态加载 1.首先创建一个layout布局fragment.xml,里面放要显示和操作的控件 2.创建一个layout布局main1.xml,用来实现页面的跳转(跳转为要实现静态加载的界面) 3. ...
- Android中的动态加载机制
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
- Android 动态加载 (一) 态加载机制 案例一
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
- Android之Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...
- Android学习——Fragment动态加载
动态加载原理 利用FragmentManager来添加一套Fragment事务,最后通过commit提交该事务来执行对Fragment的相关操作. FragmentManager fragmentma ...
- Android中插件开发篇之----动态加载Activity(免安装运行程序)
一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...
- 动态加载Layout 与 论Activity、 Window、View的关系
1)动态加载Layout的代码是 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null)); ...
- 分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。
(转载声明出处:http://www.cnblogs.com/linguanh/) 简介: 该ListView 实现动态加载数据,为了方便用户充分地自定义自己的数据源.点击事件,等核心操作, ...
随机推荐
- 【Thinkphp 5】 整合邮箱类 phpmailer实现邮件发送
第一步:下载phpmailer文件,主要用到的文件只有箭头指向的两个,thinkphp5中,把class.phpmailer.php改成了phpmailer.php 第二步: 将phpmailer文件 ...
- Css3中的 calc()使用
http://www.w3cplus.com/css3/how-to-use-css3-calc-function.html
- oracle的分组查询和连接查询
分组函数: 六个常用的分组函数: AVG,SUM,MIN,MAX,COUNT,WM_CONCAT: 行转列 PS:分组函数默认会自动过滤控制,可以使用NVL函数使分组函数无法忽略空值: 未使用NVL函 ...
- Java中获取本地某一个目录下的所有文件和文件夹
在从事web开发工作中,经常需要对本地某一个目录下的文件进行处理,而在这之前,我们需要做的就是获取到这个目录下的文件. String filepath = "D:\file";// ...
- JavaScript 基本语法 -- 数据类型 & 变量
JavaScript都有哪些数据类型呢? 在JavaScript里面,数据类型分为两类:原始类型(primitive type)和对象类型(object type) 1. 原始类型(我的理解,不可分割 ...
- CentOS上安装MongoDB速记
测试环境版本CentOS 6.5 先创建安装目标文件夹并进入至该文件夹: mkdir /opt/mongodb cd /opt/mongodb 给mongodb创建用户及用户组: groupadd m ...
- asp.net 文件上传 Uploadify HTML5 带进度条
参考的https://www.cnblogs.com/lvdabao/p/3452858.html这位,在此基础上略有修改: 1.根据Layer,将上传附件做成弹窗显示,引入frame弹窗,在项目当中 ...
- python 闯关之路一(语法基础)
1,什么是编程?为什么要编程? 答:编程是个动词,编程就等于写代码,那么写代码是为了什么呢?也就是为什么要编程呢,肯定是为了让计算机帮我们搞事情,代码就是计算机能理解的语言. 2,编程语言进化史是什么 ...
- Windows Azure Virtual Machine (34) Azure VM挂载WebDAV
<Windows Azure Platform 系列文章目录> 之前使用Azure VM,挂载box网盘.发现不能正常挂载,这里简单记录一下. 1.WebDAV的网络映射,需要WebCli ...
- Git点滴记录
合并多个commit记录 假设我们当前有三个commit信息,现在要将commit hash为 23f92c 和 409978 合并 //git rebase -i HEAD~3 那么我们可以使用 r ...