fragment实现隐藏及界面切换效果

在前文中的效果中(Android如何创建自定义ActionBar),点击屏幕下方的 TextView 以此来实现 5 种 fragment 界面的切换。

由于网络数据的加载存在于不同的界面之中,当快速的切换界面时,就会出现程序的出错。因为快速的切换时,当前界面的数据还在读取,就切换到下一个界面,下一个界面也开始加载数据,每次界面的切换都会加载数据。这样就会出错(在本文中,fragment 是使用 replace() 方法来加载界面的,)。所以可以使每个 fragment 只加载一次来减少数据的加载次数。当然可以使用缓存技术来解决问题。

本文中只使用 fragment 的隐藏或者加载来实现每个界面只加载一次。这时需要多定义一个 Fragment 变量,以充当中间的变量,来实现 fragment 的隐藏。

上文中界面切换的效果,其实很简单,即:点击当前 TextView 使其颜色改变,其他的 TextView 的颜色都变为相同颜色即可。这时可以把这些变化封装为一个方法。减少代码量。

MainActivity.java :

package com.crazy.gemi;

import android.app.SearchManager;
import android.content.Intent;
import android.graphics.Color;
import android.provider.SearchRecentSuggestions;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.TextView;

import com.crazy.gemi.ui.cheaper.CheaperFragment;
import com.crazy.gemi.ui.cheaper.SearchSuggestionSampleProvider;
import com.crazy.gemi.ui.favor.FavorFragment;
import com.crazy.gemi.ui.more.MoreFragment;
import com.crazy.gemi.ui.near.NearFragment;
import com.crazy.gemi.ui.pocket.PocketFragment;

public class MainActivity extends FragmentActivity
    implements View.OnClickListener, CheaperFragment.SearchResult{

  private TextView[] textView = new TextView[5];
  private View[] views = new View[5];
  // 其中的 firstFragment 相当于是个中间变量
  private Fragment firstFragment, nearFragment, cheaperFragment, favorFragment, pocketFragmnet, moreFragment;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    init();
    initFragment();
  }

  private void init() {

    textView[0] = (TextView)findViewById(R.id.near);
    textView[1] = (TextView)findViewById(R.id.search_cheaper);
    textView[2] = (TextView)findViewById(R.id.favor);
    textView[3] = (TextView)findViewById(R.id.pocket);
    textView[4] = (TextView)findViewById(R.id.more);

    views[0] = findViewById(R.id.near_top_line);
    views[1] = findViewById(R.id.cheaper_top_line);
    views[2] = findViewById(R.id.favor_top_line);
    views[3] = findViewById(R.id.pocket_top_line);
    views[4] = findViewById(R.id.more_top_line);

    textView[0].setOnClickListener(this);
    textView[1].setOnClickListener(this);
    textView[2].setOnClickListener(this);
    textView[3].setOnClickListener(this);
    textView[4].setOnClickListener(this);

  }

  private void initFragment() {
    firstFragment = FavorFragment.newInstance();
    favorFragment = firstFragment;
    // 最先加载的 fragment
    getSupportFragmentManager().beginTransaction().
        add(R.id.frame_layout, favorFragment).commit();
    textView[2].setTextColor(Color.BLACK);
    views[2].setBackgroundColor(Color.parseColor("#FF6600"));
  }

  @Override
  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.near:
//        getSupportFragmentManager().beginTransaction().
//            replace(R.id.frame_layout, NearFragment.newInstance()).commit();

        if(nearFragment==null){
          nearFragment= NearFragment.newInstance();
        }
        switchContent(firstFragment, nearFragment, getSupportFragmentManager().beginTransaction());
        firstFragment = nearFragment;

        selectStringAndBackgroundColor(0);
        break;
      case R.id.search_cheaper:
        if(cheaperFragment==null){
          cheaperFragment= CheaperFragment.newInstance();
        }
        switchContent(firstFragment, cheaperFragment, getSupportFragmentManager().beginTransaction());
        firstFragment = cheaperFragment;

        selectStringAndBackgroundColor(1);
        break;
      case R.id.favor:
        if(favorFragment==null){
          favorFragment= FavorFragment.newInstance();
        }
        switchContent(firstFragment, favorFragment, getSupportFragmentManager().beginTransaction());
        firstFragment = favorFragment;

        selectStringAndBackgroundColor(2);
        break;
      case R.id.pocket:
        if(pocketFragmnet==null){
          pocketFragmnet= PocketFragment.newInstance();
        }
        switchContent(firstFragment, pocketFragmnet, getSupportFragmentManager().beginTransaction());
        firstFragment = pocketFragmnet;

        selectStringAndBackgroundColor(3);
        break;
      case R.id.more:
        if(moreFragment==null){
          moreFragment= MoreFragment.newInstance();
        }
        switchContent(firstFragment, moreFragment, getSupportFragmentManager().beginTransaction());
        firstFragment = moreFragment;

        selectStringAndBackgroundColor(4);
        break;
    }
  }

  /**
   * 通过 position 的位置改变文字和 View 的颜色
   * @param position
   */
  private void selectStringAndBackgroundColor(int position){
    int sum = textView.length;
    for (int i = 0; i < sum; i++) {
      if (position == i) {
        textView[i].setTextColor(Color.BLACK);
        views[i].setBackgroundColor(Color.parseColor("#FF6600"));
      } else {
        textView[i].setTextColor(Color.GRAY);
        views[i].setBackgroundColor(Color.parseColor("#f0f0f0"));
      }
    }
  }

  /**
   * 判断是否添加了界面,以保存当前状态
   */
  public void switchContent(Fragment from, Fragment to,
               FragmentTransaction transaction) {

    if (!to.isAdded()) { // 先判断是否被add过

      transaction.hide(from).add(R.id.frame_layout, to)
          .commit(); // 隐藏当前的fragment,add下一个到Activity中
    } else {
      transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
    }

  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android fragment实现多个页面切换效果

    现在的APP首页大部分屏幕的下方显示一行Tab标签选项,点击不同的标签就可以切换到不同的界面.如下图: 我们之前都是用TabHost来实现,但是殊不知,TabHost并非是那么的简单,它的可扩展性非常的差,不能随意地定制Tab项显示的内容,而且运行还要依赖于ActivityGroup.ActivityGroup原本主要是用于为每一个TabHost的子项管理一个单独的Activity,但目前已经被废弃了.下面就借助Fragment来完成类似于TabHost一般的效果. 先实现主界面布局main_l

  • Android使用Fragment打造万能页面切换框架

    首先我们来回忆一下传统用Activity进行的页面切换,activity之间切换,首先需要新建intent对象,给该对象设置一些必须的参数,然后调用startActivity方法进行页面跳转.如果需要activity返回结果,则调用startActivityForResult方法,在onActivityResult方法中获得返回结果.此外,每一个要展示的activity需要在AndroidManifest.xml文件中注册.而且,如果在某些特定的情况下(比如65536方法数爆炸)要动态加载dex

  • Android使用TabLayou+fragment+viewpager实现滑动切换页面效果

    TabLayou 主要实现的是标题头的 滑动 这个 控件 类似于 ScrollView XML中的布局 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <android.support.design.widget.TabLayout a

  • Android开发使用Activity嵌套多个Fragment实现横竖屏切换功能的方法

    本文实例讲述了Android开发使用Activity嵌套多个Fragment实现横竖屏切换功能的方法.分享给大家供大家参考,具体如下: 一.上图 二.需求 近期项目遇到个横竖屏切换的问题,较为复杂,在此记之. 1.Activity中竖屏嵌套3个Fragment,本文简称竖屏FP1,FP2,FP3. 2.其中竖屏FP1与FP2可以切换为横屏的FL1,FL2,即竖屏FP1切换到对应的横屏FL1,竖屏FP2对应切换到横屏FL2. 3.FP3不允许横竖屏切换. 4.竖屏FP1,FP2,FP3用ViewP

  • Android Fragment中使用SurfaceView切换时闪一下黑屏的解决办法

    重构了下之前自己的一个新闻客户端,全部使用了Fragment来进行页面切换,只有一个入口Activity作为程序的启动Activity,其中有一个界面需要调用摄像头识别二维码,于是就会用到SurfaceView进行预览,那么问题来了,当切换到对应的Fragment时,屏幕会黑一下,黑了1秒左右就显示出正常的界面,而且这种现象只有第一次进入该Fragment才会出现,之后进入都不会出现,解决方法是无意在github上看到了,试了一下,可以行的通,下面贴出解决方法. 方法一.在Activity的on

  • Android App中使用ViewPager+Fragment实现滑动切换效果

    在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPager也有弊端:需要导入android-support-v4.jar.细节无法控制.不过现在情况已经不一样了,android-support-v4中提供了很多实用的功能,以至于现在新建一个android工程默认都会导入这个jar包.那我们就也采用viewpager来做滑动吧.另外一个概念就是Fragment和FragmentActivit

  • Android基础之使用Fragment控制切换多个页面

    今天讲解一下Fragment的控制,主要是切换View和页面替换等操作.还有就是如何获取Fragment的管理对象,以及与Activity的通信方式.1.管理Fragment要在activity中管理fragment,需要使用FragmentManager. 通过调用activity的getFragmentManager()取得它的实例. •可以通过FragmentManager做一些事情, 包括: 使用findFragmentById()(用于在activity layout中提供一个UI的f

  • Android中使用TabHost 与 Fragment 制作页面切换效果

    三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义页面切换的效果:切换页面时,当前页面滑出,目标页面滑入.这是2个不同的动画设定动画时要区分对待 import android.content.Context; import android.util.AttributeSet; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import

  • Android中Fragment相互切换间不被回收的实现方法

    前言 Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的.难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊.Fragment的出现就是为了解决这样的问题. 如今市面上的应用基本上都是单Activity+多Fragment实现的了,而这类APP都有在相互切换时不被回收,即切换回原来的Fragment时还是原先的状态,这就是这里要实现的了. 这里使用F

  • 一个Activity中多个Fragment的切换

    经常会遇到在一个activity界面上布局多个fragment,但是如何从一个fragment跳转到另一个fragment呢?今天在做项目中恰好遇到这样的问题,点击首页fragment的更多店铺,会切换到店铺的fragment,处理的步骤如下: 1.在一个fragment1中定义一个接口: /** * 定义地接口,用于fragment和activity之间的数据传递 */ public interface onClickShopListner{ public void setOnClickSho

随机推荐