在界面上加入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>