【Android】11.6 Fragments基本用法示例
分类:C#、Android、VS2015;
创建日期:2016-02-22
一、简介
该例子演示了如何使用两个fragment创建双区域布局的activity(纵向和横向)。在这个activity包含的两个fragment中,一个fragment用来显示笑话列表的标题,另一个fragment用来在列表项被选中时显示该笑话的详细内容。同时,该例子也演示了如何基于不同屏幕配置(纵向放置的肖像模式、横向放置的景观模式)分别提供不同的fragment。
二、运行效果
注意:【Ctrl】+【F11】是控制模拟器“竖屏/横屏”转换的快捷键。
下面是按【Ctrl】+【F11】将模拟器从竖屏旋转为横屏后看到的效果:
三、主要创建步骤
1、添加竖屏模式的ch1104_Main.xaml文件
在Resources/layout文件夹下添加该文件。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment
class="MyDemos.SrcDemos.ch1104FragmentTitles"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/titles" />
</FrameLayout>
当屏幕被置于纵向时,系统会自动适应此布局。
这个布局只包含了TitlesFragment。这就意味着,当设备置于纵向时,只有笑话标题列表是可见的。因此,当用户点击某一个列表项时,应用程序将开启一个新的activity来显示笑话的内容,而不是直接在第二个fragment中来显示它。
在fragment类中,首先显示笑话标题的TitlesFragment。这个fragment继承于ListFragment,靠它来处理笑话标题列表的工作。
2、添加横屏模式的ch1104_Main.axml文件
在Resources/layout-land文件夹下添加该文件。
注意改文件名必须和竖屏模式的文件名相同。XML代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
class="MyDemos.SrcDemos.ch1104FragmentTitles"
android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent"
android:id="@+id/titles" />
<FrameLayout
android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent"
android:id="@+id/details" />
</LinearLayout>
activity一旦载入此布局,系统就实例化TitlesFragment(列出笑话标题),同时在屏幕右方的FrameLayout中的fragment显示笑话内容。笑话内容刚开始是空字符串,当用户从列表中选择一项时,fragment才被置于FrameLayout中,这样做是为了不让其大量占用内存。
由于并不是所有的屏幕都足以能并排显示笑话列表和详细内容,所以这个布局仅适用于屏幕横向放置的情况。
切换到【设计】视图看到的界面截图如下:
3、添加ch1104ActivityMain.cs文件
在SrcDemos文件夹下添加该文件,模板选择【Activity】。
using Android.App;
using Android.OS; namespace MyDemos.SrcDemos
{
[Activity(Label = "【例11-4】Fragment基本用法")]
public class ch1104ActivitMain : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch1104_Main);
}
} public class ch1104Joke
{
public static string[] Titles = { "笑话1", "笑话2", "笑话3", "笑话4", "笑话5" };
public static string[] Dialogue = {
"笑话1:一男子在闹市骑摩托撞昏了一个陌生的老汉! 男子惊吓的不知所措!围观群众越来越多!突然,该男抱住老汉,声泪俱下的喊道:“爹,你等着我,我这就去给你找医生!”说后,就跑掉了。。。老汉挣扎着愤怒的喊道:“给老子回来!”众人纷纷感慨:“这儿子当的真孝顺!” ",
"笑话2:小明考试回家,妈妈问他:“考的咋呀?”小明说:“只有一道题错了!!”妈妈问:“啥题?”小明说:“问3乘7等于几?”妈妈问:“你说等于几”小明说:“我当时不管三七二十一填了个等于40!”",
"笑话3:昨天微信上收到一条打招呼的,打开一看,是个MM。MM:“好无聊啊!”我:“我也好无聊啊!”(期待她叫我出去玩。)MM:“无聊的话你放个屁追着玩啊!”我二话不说就把她给删了。",
"笑话4:某日,一个对中文略知一二的老外去某工厂参观。半路上厂长说:“对不起,我去方便一下。”老外不懂这句中文,问翻译:“方便是什么意思。”翻译说,“就是去厕所。”老外:“哦……”参观结束,厂长热情地对老外说:“下次你方便的时候一起吃饭!”老外一脸不高兴,用生硬的中文说:“我在方便的时候从来不吃饭!”",
"笑话5:一位女教师在黑板上画了个苹果,问同学们:“这是什么?”结果,大家回答:“屁股!”女老师哭着找校长,校长十分生气,来到教室:“你们怎么把老师给气哭了?”又看了看黑板:“哟,你们还在黑板上画了个屁股!” "
};
}
}
在SrcDemos文件夹下添加该文件,模板选择【Fragment】。
DetailsFragment在TitlesFragment的列表项被选中时显示笑话内容。
using System;
using Android.App;
using Android.OS;
using Android.Util;
using Android.Views;
using Android.Widget; namespace MyDemos.SrcDemos
{
public class ch1104FragmentDetails : Fragment
{
public int ShownIndex { get { return Arguments.GetInt("current_id", 0); } } public static ch1104FragmentDetails NewInstance(int playId)
{
var detailsFrag = new ch1104FragmentDetails { Arguments = new Bundle() };
detailsFrag.Arguments.PutInt("current_id", playId);
return detailsFrag;
} public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
if (container == null)
{
// 如果当前布局中没有container, 没有必要创建视图,所以返回null
return null;
}
var scrollView = new ScrollView(Activity);
var text = new TextView(Activity);
var padding = Convert.ToInt32(TypedValue.ApplyDimension(ComplexUnitType.Dip, 4, Activity.Resources.DisplayMetrics));
text.SetPadding(padding, padding, padding, padding);
text.TextSize = 18;
text.Text = ch1104Joke.Dialogue[ShownIndex];
scrollView.AddView(text);
return scrollView;
}
}
}
5、添加ch1104FragmentTitles.cs文件
在SrcDemos文件夹下添加该文件,模板选择【Fragment】。
using Android.App;
using Android.Content;
using Android.OS;
using Android.Views;
using Android.Widget; namespace MyDemos.SrcDemos
{
public class ch1104FragmentTitles : ListFragment
{
private bool isDualPane;
private int currentCheckPosition = 0; public override void OnActivityCreated(Bundle savedInstanceState)
{
base.OnActivityCreated(savedInstanceState); ListAdapter = new ArrayAdapter<string>(Activity,
Android.Resource.Layout.SimpleListItemActivated1, ch1104Joke.Titles); var detailsFrame = Activity.FindViewById<View>(Resource.Id.details);
isDualPane = detailsFrame != null && detailsFrame.Visibility == ViewStates.Visible; if (savedInstanceState != null)
{
currentCheckPosition = savedInstanceState.GetInt("current_id", 0);
} if (isDualPane)
{
ListView.ChoiceMode = ChoiceMode.Single;
ShowDetails(currentCheckPosition);
}
} public override void OnSaveInstanceState(Bundle outState)
{
base.OnSaveInstanceState(outState);
outState.PutInt("current_id", currentCheckPosition);
} public override void OnListItemClick(ListView l, View v, int position, long id)
{
ShowDetails(position);
} /// <summary>
/// 显示所选项的详细信息,或者通过UI中的片段显示,或者启动一个新的活动
/// </summary>
/// <param name="index">当前选项的序号</param>
private void ShowDetails(int index)
{
currentCheckPosition = index;
if (isDualPane)
{
ListView.SetItemChecked(index, true); // 检查当前显示的是哪个fragment,如果需要,就替换掉它。
var details = FragmentManager.FindFragmentById(Resource.Id.details) as ch1104FragmentDetails;
if (details == null || details.ShownIndex != index)
{
details = ch1104FragmentDetails.NewInstance(index); // 执行事务(transaction), 替换已存在的fragment
var ft = FragmentManager.BeginTransaction();
ft.Replace(Resource.Id.details, details);
ft.SetTransition(FragmentTransit.FragmentFade);
ft.Commit();
}
}
else
{
var intent = new Intent();
intent.SetClass(Activity, typeof(ch1104ActivityDetails));
intent.PutExtra("current_id", index);
StartActivity(intent);
}
}
}
}
注意:当用户点击一个列表项时会产生两个可能的行为,这依赖于两个布局哪个处于激活状态,它要么创建并显示一个新的fragment以在同一个activity中显示笑话内容(添加fragment到FrameLayout),要么启动一个新的activity(在fragment可显示的地方)。
6、添加ch1104ActivityDetails.cs文件
在SrcDemos文件夹下添加该文件,模板选择【Activity】。
DetailsActivity只是在屏幕纵向时,嵌入DetailFragment以显示被选中的笑话。
using Android.App;
using Android.Content;
using Android.OS; namespace MyDemos.SrcDemos
{
[Activity(Label = "【例11-4】Fragment基本用法")]
public class ch1104ActivityDetails : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
if (Resources.Configuration.Orientation == Android.Content.Res.Orientation.Landscape)
{
// 如果屏幕是横放的(landscape mode), 由于右侧直接显示笑话内容了,所以不需要此活动
Finish();
return;
}
var index = Intent.Extras.GetInt("current_id", 0);
var details = ch1104FragmentDetails.NewInstance(index);
FragmentManager.BeginTransaction().Add(Android.Resource.Id.Content, details).Commit();
}
}
}
注意,如果配置是横向的,这个activity会结束掉自己,使主acitivity可以接管并在TitlesFragment旁显示DetailsFragment。这种情况可能会发生在,用户在纵向时开启了DetailsActivity,但是之后旋转到横向,这会重新启动当前的activity。
OK,这一章就讲到这里了。
【Android】11.6 Fragments基本用法示例的更多相关文章
- Linux下命令行cURL的10种常见用法示例
curl的命令行工具功能非常强大,这些数据交互的功能基本上都是通过URL方式进行的,下面这篇文章主要给大家分享了在Linux中命令行cURL的10种常见用法示例,通过示例代码介绍的非常详细,需要的朋友 ...
- Linux find 用法示例
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- [转]Linux中find常见用法示例
Linux中find常见用法示例[转]·find path -option [ -print ] [ -exec -ok command ] {} \;find命令的参 ...
- oracle中to_date详细用法示例(oracle日期格式转换)
这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星期几.两个日期间的天数.月份差等用法 TO_DATE格式(以时间:2007-11-02 ...
- Linux find常用用法示例
在此处只给出find的基本用法示例,都是平时我个人非常常用的搜索功能.如果有不理解的部分,则看后面的find运行机制详解对于理论的说明,也建议在看完这些基本示例后阅读一遍理论说明,它是本人翻译自fin ...
- (转载)Android常用的Dialog对话框用法
Android常用的Dialog对话框用法 Android的版本有很多通常开发的时候对话框大多数使用自定义或是 Google提供的V4, V7 兼容包来开发保持各个版本的对话框样式统一,所以这里使用的 ...
- MySQL5.7.20源码安装以及pt-query-digest用法示例
MySQL5.7.20源码安装1.下载解压cd /data/app/mysql5.7wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5 ...
- Android/iOS内嵌Unity开发示例
Unity 与 Android/iOS 交叉开发主要有两种方式,以 Android 为例,一是 Android 生成 jar 或者 aar 包,导入到 unity3d plugin/bin/ 目录下: ...
- linux日志中查找关键字、前几行、结尾几行,Linux的find用法示例
linux在日志中查找关键字.前几行.结尾几行,Linux的find用法示例 1.linux在日志中查找关键字.前几行.结尾几行 1.1查看日志 前 n行: 1.2查看日志 尾 n行: 1.3根据 关 ...
随机推荐
- Internal Server Error: /favicon.ico 的解决方法
项目大致环境:Linux + Apache + Django + Python 因为项目的需求重写了Python Logger.error 方法,每当记录错误日志的时候就发送一封邮件到指定的邮箱.项目 ...
- cat 命令(转)
原文:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容, ...
- asp.net 使用JS获得串口数据
使用JS获得串口数据 JavaScript语言通常是一种网页编程语言,比较适合前台的一些应用设计.对于本地设备和数据的操作有比较大的限制.由于项目的需要,我需要获得本机的串口数据并显示在web端.我们 ...
- client高性能组件化框架React简单介绍、特点、环境搭建及经常使用语法
[本文源址:http://blog.csdn.net/q1056843325/article/details/54729657 转载请加入该地址] 明天就是除夕了 预祝大家新春快乐 [ ]~( ̄▽ ̄) ...
- 算法笔记_118:算法集训之结果填空题集二(Java)
目录 1 欧拉与鸡蛋 2 巧排扑克牌 3 排座位 4 黄金队列 5 汉诺塔计数 6 猜生日 7 棋盘上的麦子 8 国庆星期日 9 找素数 10 填写算式 11 取字母组成串 1 欧拉与鸡蛋 大数 ...
- PHPstorm自定义快捷键
Ctrl+alt+S 打开设置 PHPstorm 设置 PHPstorm 主题安装 自定义快捷键设置 ·全屏 F11 ·另外一种全屏alt+F11 Database数据库管理 alt+d Termin ...
- js 数组清空 方法 汇总
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Android中onTouch与onClick事件的关系
这几天遇到点关于Android的触摸事件相关的,还跟onClick有关.暂且记下: LinearLayout分别设置了onTouchListener,onClickListener,onLongCli ...
- Jquery.getJSON的缓存问题的处理方法
$.getJSON()存在缓存问题,如果其调用的url之前曾经调用过的话,回调函数就会直接在缓存里取得想要得值,而不是进入到后台 在项目中遇到一个问题,在火狐下,$.getJSON();请求数据一 ...
- archlinux使用sudo
Sudo是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用户的登陆 和管理时间,同样也提高了安全性. Sudo不是对she ...