利用Fragment创建动态UI 之 创建一个灵活的UI
2013-03-19 14:49
447 查看
当你把你的APP设计为支持多屏幕大小的时候,你可以在不同的layout配置文件里面利用fragment在屏幕的可用空间来优化你的用户体验。
比方说,在一部手持android机器上,在某一时刻,在某个用户操作界面上,仅仅显示一个fragment是最合适的。但是如果在一个平板电脑上,因为它的屏幕很广,这个时候也许我们需要显示很多个fragment铺满整个屏幕,来显示更多的信息给用户。
图1:是2个fragment,分别是同一个activity在不同大小的屏幕上不同的显示配置。在large屏幕的平板上面,2个fragment是都显示出来的,一个挨着一个,但是在一个手持设备上面,同一时间只显示一个,所以如果用户操作引出另外一个的时候,必须用另外一个替代当前的这个fragment.
相对于前面一节中我们讲到的在XML里面添加一个Fragment,更好的办法是在activity运行的时候动态的添加它。这就需要你在activity的生命周期内来改变fragment。
要进行fragment的添加或者,你必须使用
res/layout/news_articles.xml:
在你的activity里面,可以用Support Library里面的
因为这个fragment是在activity运行的时候添加到layout里面去的,而非只用<fragment>标签在xml文件里面添加的,所以activity可以移除或者用另外一个fragment替换它。
用另外一个Fragment替换已经存在的一个Fragment
替换一个fragment的过程很类似添加一个fragment,只是使用的是
比方说,在一部手持android机器上,在某一时刻,在某个用户操作界面上,仅仅显示一个fragment是最合适的。但是如果在一个平板电脑上,因为它的屏幕很广,这个时候也许我们需要显示很多个fragment铺满整个屏幕,来显示更多的信息给用户。
图1:是2个fragment,分别是同一个activity在不同大小的屏幕上不同的显示配置。在large屏幕的平板上面,2个fragment是都显示出来的,一个挨着一个,但是在一个手持设备上面,同一时间只显示一个,所以如果用户操作引出另外一个的时候,必须用另外一个替代当前的这个fragment.
FragmentManager 类提供了在activity运行的时候,用来动态的增加,移除,替换fragment的方法 ,进而达到一个动态的用户体验效果。
在Activity运行时动态的添加一个Fragment
相对于前面一节中我们讲到的在XML里面添加一个Fragment,更好的办法是在activity运行的时候动态的添加它。这就需要你在activity的生命周期内来改变fragment。
要进行fragment的添加或者,你必须使用
FragmentManager 类来创建一个FragmentTransaction的对象实例,这个实例可以提供添加,移除,替换以及一系列其他的对fragment的操作方法。如果你的activity允许一个fragment被移除和替换,首先你要在activity的onCreate方法里面添加一个fragment.
[code]对fragment进行操作的一个重要的规则是,特别是那些在activity运行时候添加的fragment:fragment必须有一个View容器,fragment的layout会在这个容器里面。
用下面的这个layout代替上节里面的那个只会显示一个fragment的layout文件。为了让fragment可以被另外一个fragment替换,这个layout里面包含了一个空的FrameLayout ,这个layout就作为fragment的容器。
这里要注意,这个layout的文件名和上一节的一样,但是所在的目录不一样,并没有用到large这个后缀来修饰这个目录,所以这个layout是在屏幕比large小的时候用到的,因为小的屏幕不需要同时显示2个fragment。
res/layout/news_articles.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" />
在你的activity里面,可以用Support Library里面的
getSupportFragmentManager() 方法来获取一个FragmentManager 对象。然后调用beginTransaction()来创建一个FragmentTransaction 对象实例,调用这个的实例的方法add()来添加fragment。你可以用同一个FragmentTransaction 对象实例来处理多个fragment的转换动作。当处理对fragment处理完成的时候,必须调用commit()方法。
[code]下面的例子就是如果为前面定义的layout添加一个fragment:
import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_articles); // Check that the activity is using the layout version with // the fragment_container FrameLayout if (findViewById(R.id.fragment_container) != null) { // However, if we're being restored from a previous state, // then we don't need to do anything and should return or else // we could end up with overlapping fragments. if (savedInstanceState != null) { return; } // Create an instance of ExampleFragment(这个HeadLinesFragment)在后面会有代码实现 HeadlinesFragment firstFragment = new HeadlinesFragment(); // In case this activity was started with special instructions from an Intent, // pass the Intent's extras to the fragment as arguments firstFragment.setArguments(getIntent().getExtras()); // Add the fragment to the 'fragment_container' FrameLayout getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, firstFragment).commit(); } } }
因为这个fragment是在activity运行的时候添加到layout里面去的,而非只用<fragment>标签在xml文件里面添加的,所以activity可以移除或者用另外一个fragment替换它。
用另外一个Fragment替换已经存在的一个Fragment
替换一个fragment的过程很类似添加一个fragment,只是使用的是
replace() 代替了add()方法。
要记住,当对某个fragment进行某项操作,比方说替换或者移除,要运行用户进行回退操作,恢复原来的改变。要让用户使用返回达到回退的效果,那你必须调用addToBackStack()在你调用调用commit()方法提交FragmentTransaction之前。
注意:当你移除或者替换一个fragment的时候,会把这个转换保存在回退栈里面,被移除的那个fragment会进入stopped状态(不是被销毁)。如果用户使用返回回退到之前的那个fragment,这个fragment会重新启动。如果不比添加这个转换到回退栈里面,那么在移除或者替换的时候,这个fragment是被销毁的。所以切记,如果要支持返回按键回退,一定要在commit之前调用addToBackStack().
下面的例子就是替换前面那个fragment的实现:
// Create fragment and give it an argument specifying the article it should show ArticleFragment newFragment = new ArticleFragment(); Bundle args = new Bundle(); args.putInt(ArticleFragment.ARG_POSITION, position); newFragment.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack so the user can navigate back transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit();
这个addToBackStack() 有一个任意的字符串参数,作为保存的这个转换的唯一标示符。一般是不需要些这个字符串名字的,除非你想要使用FragmentManager.BackStackEntry的API对fragment执行一些更高级的操作。
相关文章推荐
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之创建一个灵活的UI
- Training--使用Fragment创建动态UI(2)--构建一个灵活的UI
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之创建一个灵活的UI
- 利用Fragment创建动态UI 之 创建一个Fragment
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之与其他Fragments进行交互
- Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之与其他Fragments进行交互
- 利用Fragment创建动态UI 之 使用Support Library
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之与其他Fragments进行交互
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之创建一个Fragment
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之创建一个Fragment
- Android学习路线(二十二)运用Fragment构建动态UI——构建一个灵活的UI
- Android学习路径(22)应用Fragment建立动态UI——构建一个灵活UI
- 利用Fragment创建动态UI 之 Fragment之间的通信
- Android Training - 使用碎片创建一个动态UI(3) - 构建一个灵活的UI
- 利用Fragment创建动态UI 之 Fragment之间的通信
- Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之使用Support Library
- Training--使用Fragment创建动态UI(1)-- 创建一个Fragment
- [Andriod官方训练教程]使用Fragment创建一个动态的UI之使用Support Library