博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android学习路径(22)应用Fragment建立动态UI——构建一个灵活UI
阅读量:6237 次
发布时间:2019-06-22

本文共 3657 字,大约阅读时间需要 12 分钟。

当你设计你的应用来支持多个屏幕尺寸。你能够基于可用的屏幕空间通过在不同的布局上重用fragment来优化用户体验。

比如,在一个手机上。使用单面板(一次仅仅显示一个fragment)的用户体验更加合适。For example, on a handset device it might be appropriate to display just one fragment at a time for a single-pane user interface. 相反,你可能希望在一个可以展示很多其它信息的平板上设置并排摆放的fragments。

图 1. 同一个activity在不同的屏幕尺寸上展示的不同的fragment配置。在大尺寸屏幕上。两个fragment并排展示,而在小屏幕的设备上,一次仅仅能显示一个fragment。须要用户操作来切换它们。

 类提供了可以在执行时add, remove, 以及 replace fragment的方法,这样就行创建一个动态的用户体验。

在执行时为Activity加入一个Fragment

不同于直接在activity的布局文件里定义fragments(像在中展示的那样,使用,<fragment>元素)。你能够在activity执行时加入一个fragment。假设你打算在activity的生命周期期间更改fragment,那么这样做非常有必要。

要运行一个加入或者移除fragment操作,你必须使用 创建一个,它提供了add, remove, replace, 以及运行其它fragment事务的APIs。

假设你的activity同意fragments被移除或者替换。那么你须要在activity的onCreate()方法中加入初始化这些fragments的方法。

在使用fragment,特别是动态加入的fragment时,有一个重要的规则是fragment必须有一个容器视图,用作fragment的容器。

中展示了一个一次显示一个fragment的布局,以下的布局是上一课中那个布局的可选项。

为了使用fragment之间的切换,这个activity布局中包括了一个空的 作为fragment的容器。

能够注意到这个文件名称和上一课中的文件名称同样,可是他的布局文件夹没有包括lager限定符,因此这个布局是给小的屏幕设备使用的,由于这种屏幕不适用同一时候展示两个fragment。

res/layout/news_articles.xml:

在你的activity中。使用Support Library包的API,调用 来获取一个  。然后调用 来创建一个 。然后调用 方法来加入一个fragment。

你能够使用为activity运行多个fragment事务。

最后(当你准备好改变时)。你必须调用方法。

比如。以下是怎样为之前的布局加入一个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 a new Fragment to be placed in the activity layout            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的布局文件的<fragment>元素中被定义。这个activity可以移除这个fragment或者替换这个fragment。

替换一个fragment

替换fragment的流程和加入fragment的流程十分相似,不同的是须要调用 方法,而不是方法。

要记住当你运行一个fragment事务时,比如替换或者移除一个,这一般会同意用户返回或者撤销这些改变。要同意用户退回一个fragment事务,你必须在提交fragment事务之前调用 方法。

提示: 当你移除或者替换一个fragment而且加入这个事务到返回栈时,被移除的fragment将会被停止(而不是被销毁)。假设用户再返回到这个fragment,它会重新启动(而不是又一次创建)。假设你没有将它加入到返回栈,那么这个fragmen在被移除或者替换时就直接被销毁了。

替换fragment的样例:

// Create fragment and give it an argument specifying the article it should showArticleFragment 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 backtransaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null);// Commit the transactiontransaction.commit();

 方法须要传入一个字符串类型的參数来指定这次事务的唯一名称。假设你打算不使用高级的fragment操作APIs 。这个名字是不是角色。

你可能感兴趣的文章
C#如何开发扫雷游戏
查看>>
C/C++内存问题检查利器—Purify (四)
查看>>
asp.net MVC中怎样让LINQ Designer自动生成的类从别的类继承并调用其基类构造器?...
查看>>
用VMWARE模拟打造通用批量分发安装系统
查看>>
Python 字符串、列表、元组、索引、切片
查看>>
JAVA实现显示指定类型的文件的例子
查看>>
rm -rfi 防止误删除数据
查看>>
Java项目打war包的方法
查看>>
ubuntu server 10.4 下LVS-DR+heartbeat +Ldirectord实现web服务高可性负载均衡实验
查看>>
流媒体服务器支持flv格式文件
查看>>
(4)制作windows 2003自动安装盘-集成补丁/Raid及硬件驱动
查看>>
MDeamon如何限制进出邮件大小
查看>>
为C# as 类型转换及Assembly.LoadFrom埋坑!
查看>>
word的问题
查看>>
MDaemon邮件报表统计插件——MailDetective
查看>>
为何有着良好设计的系统代码反而不容易看懂?
查看>>
[Ajax]ajax入门
查看>>
什么是BPOS
查看>>
JSP中的四种属性范围(重点)
查看>>
Ubuntu init启动流程分析浅析
查看>>