我是靠谱客的博主 眼睛大哈密瓜,最近开发中收集的这篇文章主要介绍Android Activity中嵌套多个Fragment的使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Fragment英文翻译为碎片,可以在一个Activity中可以嵌套多个Fragment,相当于多个页面。但是它们都在同一 个Activity中,fragment的生命周期和Activity类似,如果当前Activity没有注销(onDestory)其中的众多的fragment也不会被销毁,这点不利于资源的回收。所以有时候你要考虑是使用多个fragment还是使用多个Activity。

[java] view plaincopy在CODE上查看代码片派生到我的代码片

1.可以在XML中编写,也可以在代码中编写,写一个类继承android.support.v4.app.Fragment,记住:是V4包中的Fragment.(考虑到版本的兼容性问题:fragment是Android3.0才引入的) 

2.重写父类Fragment的onCreate(),和onCreateView()方法,onCreateView方法会返回一个VIew,这个View将被填充到Activity的界面中。所以一般我们重点就是把onCreateView()覆写好。 

3.在Acticvty中产生一个fragment的实例,调用fragmentManager 和 fragmentTransaction;实现fragment的添加,移除,替换(add,remove,replace),记住,当这些事务写完以后要Commit(),保证事务被提交,这样才会生效。 

[java] view plaincopy在CODE上查看代码片派生到我的代码片

  
[java] view plaincopy在CODE上查看代码片派生到我的代码片
下面是一个DEMO:  
import android.util.Log;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.Button;  
import android.support.v4.app.FragmentManager;  
  
  
/** 
   Fragment的生命周期: 
 * 第一次启动该fragment:   onCreate --> onCreateView -->onStart --> onResume 
 *  变得不处于前台的时候:onPause  -->onDestroyView 
 *  重新回到前台时候:OnCreateView -->onStart --> onResume 
 * @author yesong 
 * 
 */  
public class ContentFragment extends Fragment {  
  
    private Button mStartButton;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        Log.i("yesongyesong", "ContentFragment : onCreate ");  
    }     
      
      
      
  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
  
        View view = inflater.inflate(R.layout.content_fragment_layout, null);  
        mStartButton = (Button) view.findViewById(R.id.start_button);  
        mStartButton.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                MainActivity activity = (MainActivity) getActivity();  
                activity.enterContentFrament01(mStartButton.getText().toString());  
  
            }  
        });  
  
        return view;  
    }  
  
}  
第二个fragment

[java] view plaincopy在CODE上查看代码片派生到我的代码片
package cn.mmb.fragment.product;  
  
import android.annotation.SuppressLint;  
import android.os.Bundle;  
import android.support.v4.app.Fragment;  
import android.util.Log;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.Button;  
import cn.mmb.fragment.MainActivity;  
import cn.mmb.fragment.R;  
import cn.mmb.fragment.inter.ViewClickListener;  
  
@SuppressLint("ValidFragment")  
public class Content01_Fragment extends Fragment {  
  
    private Button mStartButton;  
  
    /* 
     * private ViewClickListener viewClickListener; public 
     * Content01_Fragment(ViewClickListener clickListener){ 
     * this.viewClickListener = clickListener; } 
     */  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
    }  
    }  
  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
  
        View view = inflater.inflate(R.layout.content_01_fragment_layout, null);  
        mStartButton = (Button) view.findViewById(R.id.content01_button);  
        mStartButton.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                MainActivity activity = (MainActivity) getActivity();  
                activity.enterContentFrament02(mStartButton.getText().toString());  
            }  
        });  
[java] view plaincopy在CODE上查看代码片派生到我的代码片
<span style="font-family: Arial, Helvetica, sans-serif;">     return view;</span>  

[java] view plaincopy在CODE上查看代码片派生到我的代码片
}  
第三个fragment


[java] view plaincopy在CODE上查看代码片派生到我的代码片
package cn.mmb.fragment.product;  
  
import android.annotation.SuppressLint;  
import android.os.Bundle;  
import android.support.v4.app.Fragment;  
import android.util.Log;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.Button;  
import cn.mmb.fragment.MainActivity;  
import cn.mmb.fragment.R;  
import cn.mmb.fragment.inter.ViewClickListener;  
  
@SuppressLint("ValidFragment")  
public class Content02_Fragment extends Fragment {  
  
    private Button mStartButton;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
    }  
  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
  
        View view = inflater.inflate(R.layout.content_02_fragment_layout, null);  
        mStartButton = (Button) view.findViewById(R.id.no_more_button);  
        mStartButton.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                  
  
            }  
        });  
          
        return view;  
    }  
  
}  
Activity使用我们已经写好的fragment

[java] view plaincopy在CODE上查看代码片派生到我的代码片
package cn.mmb.fragment;  
  
import cn.mmb.fragment.product.ButtomFragment;  
import cn.mmb.fragment.product.Content01_Fragment;  
import cn.mmb.fragment.product.Content02_Fragment;  
import cn.mmb.fragment.product.ContentFragment;  
import cn.mmb.fragment.product.TitleBarFragment;  
import android.os.Bundle;  
import android.support.v4.app.FragmentActivity;  
import android.support.v4.app.FragmentManager;  
import android.support.v4.app.FragmentTransaction;  
import android.view.KeyEvent;  
import android.view.View;  
import android.widget.FrameLayout;  
import android.widget.LinearLayout;  
  
public class MainActivity extends FragmentActivity/* implements ViewClickListener */{  
  
    private TitleBarFragment mTitleBarFragment;  
    private ContentFragment mContentFragment;  
    private Content01_Fragment mContent01Fragment;  
    private Content02_Fragment mContent02Fragment;  
    private ButtomFragment mButtomFragment;  
    //private FrameLayout mContentLayout;  
    private LinearLayout mTitleBarLayout;  
    private LinearLayout mButtomLayout;  
    private FragmentTransaction fragmentTransaction;  
    private FragmentManager fragmentManager;  
    /** 
     *  to remember  current fragment, 
     *  if mfragmentIndex == 0 that there is currently a  contentFragmemt 
     */  
    private int mFragmentIndex = 0;   
    /** 
     *  to remember  last time title bar message 
     */  
    private String mLastTitleMessage;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        mTitleBarLayout = (LinearLayout) findViewById(R.id.titlebar_layout);  
        //mContentLayout = (FrameLayout) findViewById(R.id.content_layout);  
        mButtomLayout = (LinearLayout) findViewById(R.id.buttom_layout);  
        mTitleBarLayout.setVisibility(View.GONE);  
  
        fragmentManager = getSupportFragmentManager();  
        fragmentTransaction = fragmentManager.beginTransaction();  
  
        mContentFragment = new ContentFragment();  
        mButtomFragment = new ButtomFragment();  
  
          
         fragmentTransaction.add(R.id.content_layout, mContentFragment,null);  
         fragmentTransaction.add(R.id.buttom_layout, mButtomFragment,null);  
          
        /*fragmentTransaction.replace(R.id.content_layout, mContentFragment); 
        fragmentTransaction.replace(R.id.buttom_layout, mButtomFragment);*/  
        fragmentTransaction.commit();  
  
    }  
  
     /**  
      * Before using a callback to control other fragment and some view, 
      * but now find  a better method : Fragment.this.getActivity(); 
      */  
    /* @Override  
     public void buttonClick(View v, String msg) {   
      switch (v.getId()) {  
      case R.id.start_button: enterContentFrament01(msg); 
      break; 
      case R.id.content01_button: enterContentFrament02(msg); break; 
      default: break; 
       }  
      }*/  
  
    /** 
     * enter the  Third content fragment 
     * @param msg : the  titleBarMessage 
     */  
    public void enterContentFrament02(String msg) {  
  
        if (mTitleBarFragment != null) {  
            mLastTitleMessage = mTitleBarFragment.getTitleMessage();  
            mTitleBarFragment.setTitleMessage(msg);  
        }  
        if (mContent02Fragment == null) {  
            mContent02Fragment = new Content02_Fragment();  
        }  
        fragmentTransaction = fragmentManager.beginTransaction();  
          
        fragmentTransaction.replace(R.id.content_layout, mContent02Fragment);  
          
        //fragmentTransaction.add(R.id.content_layout, mContent02Fragment);  
        fragmentTransaction.addToBackStack(null);  
        fragmentTransaction.commit();  
        mFragmentIndex++;  
  
    }  
  
    /** 
     * enter the  second content fragment 
     * @param msg : the  titleBarMessage 
     */  
    public void enterContentFrament01(String msg) {  
  
        if (mTitleBarFragment == null) {  
            mTitleBarFragment = new TitleBarFragment(msg);  
        }  
        mLastTitleMessage = mTitleBarFragment.getTitleMessage();  
        mTitleBarFragment.setTitleMessage(msg);  //set TitleBar message  
  
        if (mContent01Fragment == null) {  
            mContent01Fragment = new Content01_Fragment();  
        }  
        mTitleBarLayout.setVisibility(View.VISIBLE);     
        mButtomLayout.setVisibility(View.GONE);  
        fragmentTransaction = fragmentManager.beginTransaction();  
        fragmentTransaction.replace(R.id.titlebar_layout, mTitleBarFragment);  
        fragmentTransaction.replace(R.id.content_layout, mContent01Fragment);  
          
        /*fragmentTransaction.add(R.id.titlebar_layout, mTitleBarFragment); 
        fragmentTransaction.add(R.id.content_layout, mContent01Fragment);*/  
          
        fragmentTransaction.addToBackStack(null);  
        fragmentTransaction.commit();  
        mFragmentIndex++;  
  
    }  
  
    @Override  
    public boolean onKeyUp(int keyCode, KeyEvent event) {  
  
        if (keyCode == KeyEvent.KEYCODE_BACK) {  
            mFragmentIndex--;  
            if (mFragmentIndex == 0) {   
                mButtomLayout.setVisibility(View.VISIBLE);  
                mTitleBarLayout.setVisibility(View.GONE);  
            }  
        }  
        if (mTitleBarFragment != null) {  
            mTitleBarFragment.setTitleMessage(mLastTitleMessage);  
        }  
        return super.onKeyUp(keyCode, event);  
    }  
  
}  

运行效果图:
         
   第一个fragment  (白色)                   第2个fragment  (黄色)              第3个fragment(红色)

  点击button进入第2个fragment           点击button进入第3个fragment                    

  下面的的menu也是fragment              上面的titleBar也是一个fragment

 

以上是多个fragment都在同一个Activity中跳转。

最后

以上就是眼睛大哈密瓜为你收集整理的Android Activity中嵌套多个Fragment的使用的全部内容,希望文章能够帮你解决Android Activity中嵌套多个Fragment的使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部