• [Android学习系列9]关于Fragment的一些事


    在界面上加入fragment?

    方法1.用fragmentManager 和 fragmentTransaction 把fragment    add上去

    方法2.用viewpager 绑定一个 对应fragment的适配器

    Fragment动画过渡效果

    http://blog.csdn.net/mayingcai1987/article/details/6341608

    http://www.cnblogs.com/lcyty/archive/2013/10/23/3383960.html

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

    http://www.jb51.net/article/40108.htm

    fragment 和 activity 的生命周期对比

    http://blog.csdn.net/think_soft/article/details/7272869

    理解fragment事务的栈

    在事务操作里每一次操作fragment后 addToBackStack( "tag名" )    把当前操作状态压入栈里

    popBackStack()   可以弹出一个状态

    popBackStack("tag名",0) 可以弹栈一直弹到栈顶为"tag名"的那个状态

    popBackStack("tag名",FragmentManager.POP_BACK_STACK_INCLUSIVE)   可以弹栈一直弹到"tag名"前的那个状态,(也就是把"tag名")弹出去

    作用: 

    用户按下后退键后,将会返回栈里的前一个状态,而不是直接关闭当前fragment所在的activity

    参考资料:

    android Fragments详解一:概述

    android Fragments详解二:创建Fragment

    android Fragments详解三:实现Fragment的界面

    android Fragments详解四:管理fragment

    android Fragments详解五:与activity通讯

    android Fragments详解六:处理fragement的生命周期

    android Fragments详解七:fragement示例

    附上一个练习代码,有时间再补充说明

    package com.example.test_fragment;
    
    import android.app.Activity;
    import android.app.Fragment;
    import android.app.FragmentManager;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    	
    	FragmentManager fragmentManager;  //fragment管理器
    	FragmentTransaction fragmentTransaction;  //事务
    	
    	Fragment fragmentA;
    	Fragment fragmentB;
    	
    	//各种按钮
    	Button btA,btB,btRemoveA,btRemoveB,btReplaceA,btReplaceB;
    	Button btAttachA,btDetachA;
    	
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		//创建fragment管理器
    		fragmentManager = getFragmentManager();
    		
    		btA = (Button)findViewById(R.id.button1);
    		btB = (Button)findViewById(R.id.button2);
    		
    		btRemoveA  = (Button)findViewById(R.id.button3);
    		btRemoveB = (Button)findViewById(R.id.button4);
    		
    		btReplaceA = (Button)findViewById(R.id.button5); //把A换成B
    		btReplaceB = (Button)findViewById(R.id.button6); //把B换成A
    		
    		btAttachA = (Button)findViewById(R.id.button7);  //attach fragmentA
    		btDetachA = (Button)findViewById(R.id.button8);  //detach fragmentA
    		
    		initListener();
    		
    	
    	}
    	
    	
    	private void initListener() {
    		
    		btA.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View arg0) {
    				addFragmentA();
    			}
    		});
    		
    		
    		btB.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				addFragmentB();
    			}
    		});
    		
    		btRemoveA.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				removeFramgent("A");
    			}
    		});
    		
    		
    		btRemoveB.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				removeFramgent("B");
    			}
    		});
    		
    		
    		btReplaceA.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				replaceFragment("A");
    			}
    
    			
    		});
    		
    		
    		btReplaceB.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				replaceFragment("B");
    			}
    
    			
    		});
    		
    		btAttachA.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				attachA();
    			}
    
    		});
    		
    		
    		btDetachA.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				detachA();
    			}
    		});
    	}
    
    
    	public void addFragmentA() {
    		
    		//先建立好fragment对象
    		fragmentA = new FragmentA();
    		
    		
    		//开始事务
    		fragmentTransaction = fragmentManager.beginTransaction();
    		
    		//添加fragment  
    		//参数1  fragment所在layout的id
    		//参数2  fragment对象
    		//参数3  用来代表这个fragment 的一个tag 之后可以通过tag来找这个fragment
    		fragmentTransaction.add(R.id.fragmentholder, fragmentA, "A");
    		
    		//结束事务
    		fragmentTransaction.commit();
    		
    	}
    	
    	public void addFragmentB() {
    		
    		fragmentB = new FragmentB();
    
    		//开始事务
    		fragmentTransaction = fragmentManager.beginTransaction();
    		fragmentTransaction.add(R.id.fragmentholder, fragmentB, "B");
    		//结束
    		fragmentTransaction.commit();
    		
    		
    	}
    	
    	public void removeFramgent(String str) {
    		
    		Fragment deletedFragment = (Fragment)fragmentManager.findFragmentByTag(str);
    		if(deletedFragment != null)
    		{
    			//开始事务
    			fragmentTransaction = fragmentManager.beginTransaction();
    			fragmentTransaction.remove(deletedFragment);
    			//结束
    			fragmentTransaction.commit();
    		}
    		else
    		{
    			Toast.makeText(getApplicationContext(), "没有找到要remove的fragment", Toast.LENGTH_LONG).show();
    		}
    	}
    	
    	
    	public void replaceFragment(String str) {
    		if(str == "A")
    		{
    			Fragment fragment = new FragmentB();
    			//开始事务喽
    			fragmentTransaction = fragmentManager.beginTransaction();
    			//第一个参数  fragment所在的layout id
    			//第二个参数  新的fragment
    			//第三个参数  新的fragment的tag
    			fragmentTransaction.replace(R.id.fragmentholder, fragment, "B");
    			//结束事务喽
    			fragmentTransaction.commit();
    		}
    		else if(str == "B")
    		{
    			Fragment fragment = new FragmentA();
    			fragmentTransaction = fragmentManager.beginTransaction();
    			fragmentTransaction.replace(R.id.fragmentholder, fragment, "A");
    			fragmentTransaction.commit();
    		}
    		
    	}
    	
    	public void attachA() {
    		
    		//获得fragmentA的引用,第一次一定要先add  然后才能通过tag找到
    		//流程如下
    		//先add(add里面包括了attach)  然后fragment就会 和activity  联系
    		//然后 detach  此时fragment就会和activity解除联系  
    		//(注意,detach和remove不同的地方就是解除联系后没有删掉它,还可以通过它的tag找到它)
    		//最后通过attach 可以把解除联系后的fragment在重新绑定到activity界面
    		Fragment fragment = (Fragment)fragmentManager.findFragmentByTag("A");
    		//开启事务
    		fragmentTransaction = fragmentManager.beginTransaction();
    		if( fragment != null ) {
    			fragmentTransaction.attach(fragment);
    			fragmentTransaction.commit();
    		}
    		else if( fragment == null)
    		{
    			Toast.makeText(this, "没找到要attach的fragment", Toast.LENGTH_LONG).show();
    		}
    		
    	}
    	
    	
    	public void detachA() {
    		
    		//detach 的minSdkVersion 居然是13,所以我的minSdkVersion 从8 改到 11 再改到 13
    		
    		Fragment fragment = (Fragment)fragmentManager.findFragmentByTag("A");
    		//开启事务
    		fragmentTransaction = fragmentManager.beginTransaction();
    		if( fragment != null ) {
    			fragmentTransaction.detach(fragment);
    			fragmentTransaction.commit();
    		}
    		else if( fragment == null)
    		{
    			Toast.makeText(this, "没找到要detach的fragment", Toast.LENGTH_LONG).show();
    		}
    	}
    	
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    }
    

     

    主界面布局  一些按钮  和一个用来装 fragment的linearlayout

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        tools:context=".MainActivity"
        android:orientation="vertical" >
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
    
                <Button
                    android:id="@+id/button1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="add fragmeA" />
    
                <Button
                    android:id="@+id/button2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="add fragmentB" />
    
            </LinearLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
    
                <Button
                    android:id="@+id/button3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="remove fragmentA" />
    
                <Button
                    android:id="@+id/button5"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="用B换A" />
    
            </LinearLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
    
                <Button
                    android:id="@+id/button4"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="remove fragmentB" />
    
                <Button
                    android:id="@+id/button6"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="用A换B" />
    
            </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
    
            <Button
                android:id="@+id/button7"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Attach A" />
    
            <Button
                android:id="@+id/button8"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="detach A" />
    
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/fragmentholder"
            android:layout_width="fill_parent"
            android:layout_height="120dp"
            android:orientation="vertical" >
        </LinearLayout>
    
    </LinearLayout>
    

      

      

     fragment a 的布局

    <?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="100dp"
        android:orientation="vertical"
        android:background="#ddd" >
        
        <TextView 
            android:text="这里是fragment a"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>
        
    
    </LinearLayout>
    

      

    fragment b 的布局

    <?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="100dp"
        android:orientation="vertical"
        android:background="#CEDDED" >
        
        <TextView 
            android:text="这里是fragment b"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>
        
    
    </LinearLayout>
    

      

      

  • 相关阅读:
    基于Visual C++2013拆解世界五百强面试题--题9-找出所有的排列方式
    基于Visual C++2013拆解世界五百强面试题--题8-数组的排序和查找
    基于Visual C++2013拆解世界五百强面试题--题7-链表的各种操作
    宣布在 Azure 镜像库中正式推出 Windows Server 2012 R2 并降低 Windows Azure 的实例定价
    基于Visual C++2013拆解世界五百强面试题--题6-double类型逆序
    基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr
    Paging
    Swapping
    Partitioning
    Stationary point
  • 原文地址:https://www.cnblogs.com/sleeptothedeath/p/3682287.html
Copyright © 2020-2023  润新知