为了管理Activity中的fragments,需要使用FragmentManager.
为了得到它,需要调用Activity中的getFragmentManager()方法。
因为FragmentManager的API是在AndroID 3.0,也即API level 11开始引入的,所以对于之前的版本,需要使用support library中的FragmentActivity,并且使用getSupportFragmentManager()方法。
用FragmentManager可以做的工作有:
得到Activity中存在的fragment:
使用findFragmentByID()或findFragmentByTag()方法。
将fragmentd出back stack:
popBackStack():将back stack中最后一次的fragment转换d出。如果没有可以出栈的东西,返回false。
这个函数是异步的:它将d出栈的请求加入队列,但是这个动作直到应用回到事件循环才会执行。
为back stack加上监听器:
addOnBackStackChangedListener()
Performing Fragment Transactions
使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。
所有这些改变构成一个集合,这个集合被叫做一个transaction。
可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,这样用户就可以进行fragment变化的回退 *** 作。
可以这样得到FragmentTransaction类的实例:
复制代码 代码如下:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每个transaction是一组同时执行的变化的集合。
用add(),remove(),replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。
在commit()方法之前,你可以调用addToBackStack(),把这个transaction加入back stack中去,这个back stack是由activity管理的,当用户按返回键时,就会回到上一个fragment的状态。
比如下面的代码就是用一个新的fragment取代之前的fragment,并且将前次的状态存储在back stack中。
复制代码 代码如下:
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container vIEw with this fragment,
// and add the transaction to the back stack
transaction.replace(R.ID.fragment_container,newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
在这个例子中,newFragment将取代在R.ID.fragment_container容器中的fragment,如果没有,将直接添加新的fragment。
通过调用addToBackStack(),commit()的一系列转换作为一个transaction被存储在back stack中,用户按Back键可以返回上一个转换前的状态。
当你移除一个fragment的时候,如果commit()之前没有调用addToBackStack(),那个fragment将会是destroyed;如果调用了addToBackStack(),这个fragment会是stopped,可以通过返回键来恢复。
关于commit()方法
调用commit()方法并不能立即执行transaction中包含的改变动作,commit()方法把transaction加入activity的UI线程队列中。
但是,如果觉得有必要的话,可以调用executePendingTransactions()方法来立即执行commit()提供的transaction。
这样做通常是没有必要的,除非这个transaction被其他线程依赖。
注意:你只能在activity存储它的状态(当用户要离开activity时)之前调用commit(),如果在存储状态之后调用commit(),将会抛出一个异常。
这是因为当activity再次被恢复时commit之后的状态将丢失。如果丢失也没关系,那么使用commitAllowingStateLoss()方法。
实例程序
写了个小程序实践了一下fragment的管理,程序不是很完善,就是试试基本用法,先按第一个按钮添加一个fragment,第二个按钮将其替换,第三个按钮将第二个按钮添加的fragment删除。
相关代码:
第一个fragment:
复制代码 代码如下:
ExampleFragment.java
package com.example.learningfragment;
import androID.os.Bundle;
import androID.support.v4.app.Fragment;
import androID.vIEw.LayoutInflater;
import androID.vIEw.VIEw;
import androID.vIEw.VIEwGroup;
public class ExampleFragment extends Fragment
{
//三个一般必须重载的方法
@OverrIDe
public voID onCreate(Bundle savedInstanceState)
{
// Todo auto-generated method stub
super.onCreate(savedInstanceState);
System.out.println("ExampleFragment--onCreate");
}
@OverrIDe
public VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,
Bundle savedInstanceState)
{
System.out.println("ExampleFragment--onCreateVIEw");
return inflater.inflate(R.layout.example_fragment_layout,container,false);
}
@OverrIDe
public voID onPause()
{
// Todo auto-generated method stub
super.onPause();
System.out.println("ExampleFragment--onPause");
}
@OverrIDe
public voID onResume()
{
// Todo auto-generated method stub
super.onResume();
System.out.println("ExampleFragment--onResume");
}
@OverrIDe
public voID onStop()
{
// Todo auto-generated method stub
super.onStop();
System.out.println("ExampleFragment--onStop");
}
}
它的布局:
复制代码 代码如下:
example_fragment_layout.xml
<?xml version="1.0" enCoding="utf-8"?>
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent"
androID:orIEntation="vertical" >
<TextVIEw
androID:layout_wIDth="match_parent"
androID:layout_height="wrap_content"
androID:gravity="left"
androID:textSize="20dip"
androID:text="@string/fragment1"
/>
<TextVIEw
androID:layout_wIDth="match_parent"
androID:layout_height="wrap_content"
androID:text="@string/num1"
/>
<TextVIEw
androID:layout_wIDth="match_parent"
androID:layout_height="wrap_content"
androID:text="@string/num2"
/>
</linearLayout>
第二个fragment:
复制代码 代码如下:
NewFragment.java
package com.example.learningfragment;
import androID.os.Bundle;
import androID.support.v4.app.Fragment;
import androID.vIEw.LayoutInflater;
import androID.vIEw.VIEw;
import androID.vIEw.VIEwGroup;
public class NewFragment extends Fragment
{
//三个一般必须重载的方法
@OverrIDe
public voID onCreate(Bundle savedInstanceState)
{
// Todo auto-generated method stub
super.onCreate(savedInstanceState);
System.out.println("NewFragment--onCreate");
}
@OverrIDe
public VIEw onCreateVIEw(LayoutInflater inflater,
Bundle savedInstanceState)
{
System.out.println("NewFragment--onCreateVIEw");
return inflater.inflate(R.layout.new_fragment_layout,false);
}
@OverrIDe
public voID onPause()
{
// Todo auto-generated method stub
super.onPause();
System.out.println("NewFragment--onPause");
}
}
复制代码 代码如下:
new_fragment_layout.xml
<?xml version="1.0" enCoding="utf-8"?>
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent"
androID:orIEntation="vertical" >
<TextVIEw
androID:layout_wIDth="match_parent"
androID:layout_height="wrap_content"
androID:textSize="20dip"
androID:gravity="left"
androID:text="@string/fragment2"
/>
<TextVIEw
androID:layout_wIDth="match_parent"
androID:layout_height="wrap_content"
androID:text="@string/num3"
/>
<TextVIEw
androID:layout_wIDth="match_parent"
androID:layout_height="wrap_content"
androID:text="@string/num4"
/>
</linearLayout>
主Activity:
复制代码 代码如下:
LearnFragment.java
package com.example.learningfragment;
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.VIEw;
import androID.Widget.button;
public class LearnFragment extends FragmentActivity
{
button btn1;
button btn2;
button btn3;
ExampleFragment fragmentE;
NewFragment fragmentN;
FragmentManager fragmentManager;
@OverrIDe
public voID onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentVIEw(R.layout.activity_learn_fragment);
findVIEws();
setListeners();
//获得Fragment管理所需要的类的对象
fragmentManager = getSupportFragmentManager();
}
private voID findVIEws()
{
btn1 = (button) findVIEwByID(R.ID.btn1);
btn2 = (button) findVIEwByID(R.ID.btn2);
btn3 = (button) findVIEwByID(R.ID.btn3);
}
private voID setListeners()
{
//第一个按钮,增加一个ExampleFragment
btn1.setonClickListener(new button.OnClickListener()
{
public voID onClick(VIEw v)
{
//在程序中加入ExampleFragment
fragmentE = new ExampleFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.ID.linear1,fragmentE);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
);
//第二个按钮,用一个NewFragment替换前面增加的那个fragment
btn2.setonClickListener(new button.OnClickListener()
{
public voID onClick(VIEw v)
{
fragmentN = new NewFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.ID.linear1,fragmentN);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
);
//第三个按钮,移除fragment
btn3.setonClickListener(new button.OnClickListener()
{
public voID onClick(VIEw v)
{
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(fragmentN);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
);
}
}
复制代码 代码如下:
activity_learn_fragment.xml
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"
xmlns:tools="http://schemas.androID.com/tools"
androID:ID="@+ID/linear1"
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent"
androID:orIEntation="vertical"
>
<TextVIEw
androID:layout_wIDth="match_parent"
androID:layout_height="wrap_content"
androID:textSize="20dip"
androID:gravity="center_horizontal"
androID:text="@string/layout1"
/>
<button
androID:ID="@+ID/btn1"
androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"
androID:text="@string/btn1"
/>
<fragment
androID:name="com.example.learningfragment.ExampleFragment"
androID:ID="@+ID/fragment1"
androID:layout_wIDth="match_parent"
androID:layout_height="wrap_content"
/>
<button
androID:ID="@+ID/btn2"
androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"
androID:text="@string/btn2"
/>
<linearLayout
xmlns:androID="http://schemas.androID.com/apk/res/androID"
androID:ID="@+ID/linear2"
androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"
androID:orIEntation="vertical"
>
<TextVIEw
androID:layout_wIDth="match_parent"
androID:layout_height="wrap_content"
androID:textSize="20dip"
androID:gravity="center_horizontal"
androID:text="@string/layout2"
/>
<button
androID:ID="@+ID/btn3"
androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"
androID:text="@string/btn3"
/>
</linearLayout>
</linearLayout>
资源:
复制代码 代码如下:
strings.xml
<resources>
<string name="app_name">LearningFragment</string>
<string name="hello_world">Hello World!</string>
<string name="menu_settings">Settings</string>
<string name="Title_activity_learn_fragment">LearnFragment</string>
<string name="layout1">linearLayout1</string>
<string name="layout2">linearLayout2</string>
<string name="fragment1">FragmentType1</string>
<string name="fragment2">FragmentType2</string>
<string name="num1">NO.1</string>
<string name="num2">NO.2</string>
<string name="num3">NO.3</string>
<string name="num4">NO.4</string>
<string name="btn1">Add fragment</string>
<string name="btn2">Replace fragment</string>
<string name="btn3">Remove fragment</string>
</resources>
程序运行截图:
参考资料:
API GuIDes:Fragments
http://developer.androID.com/guIDe/components/fragments.HTML
FragmentManager类文档:
http://developer.androID.com/reference/androID/app/FragmentManager.HTML
FragmentTransaction类文档
http://developer.androID.com/reference/androID/app/FragmentTransaction.HTML 总结
以上是内存溢出为你收集整理的Android 管理Activity中的fragments全部内容,希望文章能够帮你解决Android 管理Activity中的fragments所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)