当前位置: 代码迷 >> Android >> android fragmnet重叠有关问题解决方案
  详细解决方案

android fragmnet重叠有关问题解决方案

热度:17   发布时间:2016-04-28 01:14:28.0
android fragmnet重叠问题解决方案

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);
}
}
}
}




  相关解决方案