fragment在3.0被引入以后,项目使用fragment越来越多,特别是主界面是底部tab页点击切换更换内容,比如我现在的项目就是这样


现在很多app都采用这种做法,因为这是主界面,能把更多的信息数据展示给用户看,如果是用activity消耗就比较大,而activity是android的四大组件之一,如果使用fragment,第一方便管理,因为每个单独的业务是和activity分开的,fragment也有自己的生命周期方法,

一般底部tab现在你比较多的做法有三种

一:viewapager+fragment 这种方式有一个不好的地方就是fragment老是会被创建,如果在fragment中初始化网络请求,如果切换过快的话会出现界面闪的情况,这样对用户体验很不好,而且也多次请求网络,比较废用户的流量,而且还要把viewpager的滑动事件给禁止掉,这个倒是简单

二:就是单纯的采用fragment 因为fragment是有容器管理的,如果切换采用replace方法的话,也有一个大问题就是fragment每次都会被创建,一般频繁切换Fragment会导致频繁的释放和创建,如果Fragment比较臃肿体验就非常不好了,而且会偶现重叠现象,

三:使用fragment的add添加然后判断该fragment是否被添加了 然后已被添加的可以隐藏(hide)让当前的被点击的tab所显示的内容fragment show出来,但是这个也会出现重叠的现象,但是这种方式比上述二种方法好处在于fragment如果没有被销毁的话只会创建一次,这样我们在切换tab时不会导致重复创建fragment的情况,用户体验也比较好!

新建一个android项目:tabsfragment

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/ll_bottom"
android:layout_width="fill_parent"
android:layout_height="45dp"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
>
<Button
android:id="@+id/btn_square"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="广场"
android:textSize="15sp"
android:layout_weight="1"
/>
<Button
android:id="@+id/btn_message"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="消息"
android:textSize="15sp"
android:layout_weight="1"
/>
<Button
android:id="@+id/btn_me"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="我"
android:textSize="15sp"
android:layout_weight="1"
/>
</LinearLayout>
<RelativeLayout
android:id="@+id/rl_show_content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/ll_bottom"
/>
</RelativeLayout>

MainActivity.java

package com.example.tabsfragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class MainActivity extends FragmentActivity implements OnClickListener {
private Button btn_square;
private Button btn_message;
private Button btn_me;
private SquareFragment squareFragment;
private MessageFragment messageFragment;
private MeFragment meFragment;
private Fragment currentFragment ;
private int index;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btn_square = (Button) findViewById(R.id.btn_square);
btn_message = (Button) findViewById(R.id.btn_message);
btn_me = (Button) findViewById(R.id.btn_me);

btn_me.setOnClickListener(this);
btn_square.setOnClickListener(this);
btn_message.setOnClickListener(this);


squareFragment = new SquareFragment();
messageFragment = new MessageFragment();
meFragment = new MeFragment();
display(squareFragment);
index = 1;
}
private void display(Fragment displayFragment) {
if (currentFragment != displayFragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (displayFragment == null) return;


if (displayFragment.isAdded()) {
transaction.show(displayFragment);
} else {
transaction.add(R.id.rl_show_content, displayFragment);
}


if (currentFragment != null) {
transaction.hide(currentFragment);
}
currentFragment = displayFragment;
transaction.commit();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_me:
display(meFragment);
index = 3;
break;
case R.id.btn_square:
display(squareFragment);
index = 1;

break;
case R.id.btn_message:
display(messageFragment);
index = 2;
break;
}
}
}

如图:


但是会偶现重叠现象,但是在程序崩毁的情况如果回到主界面比会出现重叠现象,然后再点击tab就会发现界面重叠现象,

解决方案是在onSaveInstanceState()方法中保存之前点击的是那个tab对应的fragment,然后在onRestoreInstanceState()方法中,把保存的值取出来,做判断,但是在这里一定要注意一点就是在onSaveInstanceState这个方法中一定要把这行代码注释掉// super.onSaveInstanceState(outState);


完整的代码:

package com.example.tabsfragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class MainActivity extends FragmentActivity implements OnClickListener {
private Button btn_square;
private Button btn_message;
private Button btn_me;
private SquareFragment
squareFragment;
private MessageFragment messageFragment;
private MeFragment meFragment;
private Fragment currentFragment ;
private int index;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btn_square = (Button) findViewById(R.id.btn_square);
btn_message = (Button) findViewById(R.id.btn_message);
btn_me = (Button) findViewById(R.id.btn_me);

btn_me.setOnClickListener(this);
btn_square.setOnClickListener(this);
btn_message.setOnClickListener(this);



squareFragment = new SquareFragment();
messageFragment = new MessageFragment();
meFragment = new MeFragment();
display(squareFragment);
index = 1;
}
private void display(Fragment displayFragment) {
if (currentFragment != displayFragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (displayFragment == null) return;


if (displayFragment.isAdded()) {
transaction.show(displayFragment);
} else {
transaction.add(R.id.rl_show_content, displayFragment);
}


if (currentFragment != null) {
transaction.hide(currentFragment);
}
currentFragment = displayFragment;
transaction.commit();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_me:
display(meFragment);
index = 3;
break;
case R.id.btn_square:
display(squareFragment);
index = 1;

break;
case R.id.btn_message:
display(messageFragment);
index = 2;
break;

}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
outState.putInt("index", index);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
int savedIndex = savedInstanceState.getInt("index");
if (savedIndex != this.index) {//activity oncreate后 this.index一定=0
if (squareFragment.isAdded()) {
getSupportFragmentManager().beginTransaction().hide(squareFragment).commit();
}
if (savedIndex == 2) {
display(messageFragment);
} else if (savedIndex == 3){
display(meFragment);
}
}
}
}




更多相关文章

  1. android多进程深入分析
  2. Android四大核心组件之一-----Service(服务)的基本知识
  3. 旋屏时,OnCreate方法重复调用的解决
  4. React Native调用Android原生方法
  5. android仿iPhone滚轮控件实现及源码分析(二)
  6. Android控件架构详解
  7. 采用回调Activity的形式创建AlertDialog单选列表框
  8. Activity的启动流程分析
  9. Android获取控件宽高的几种方式

随机推荐

  1. android Retrofit 简单使用
  2. Android 倒车影像车道线,3D效果
  3. android 使用Activity类布局时怎样让图片
  4. Android中Http请求
  5. 第一节(搭建环境)
  6. Android复制粘贴
  7. TimePicker TimePickerDialog
  8. android中的后退键响应事件
  9. 对android的Activity切换时输入法不弹出
  10. Android--launcher启动过程解析