Android官方开发文档Training系列课程中文版:多样屏幕之实现自适应UI

原文地址:http://android.xsoftlab.net/training/multiscreen/adaptui.html

基于程序当前所显示的布局来说,UI流程可能会有所不同。比如说,如果程序当前处于多面板模式,点击左面板中的项目会直接在右面版中显示具体的内容;如果当前是单面板模式,那么具体的内容则会在新的页面中显示。

检查当前的布局

因为每种布局的实现可能会有所不同,所以首先要做的事情就是检查用户当前使用的是哪种布局。比如说,你可能需要知道用户当前处于”单面板”模式还是”多面板”模式。你可以通过查询给定的View是否存在及是否可见的方式来得知当前的模式。

public class NewsReaderActivity extends FragmentActivity {boolean mIsDualPane;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_layout);View articleView = findViewById(R.id.article);mIsDualPane = articleView != null && articleView.getVisibility() == View.VISIBLE;}
}

注意这部分代码在查询”article”面板是否可用,这要比查询指定布局的方式要灵活的多。

如何适配不同的组件的另一个示例是通过检查这些组件是否可用的方式来完成的。比如说,在新闻阅读APP中,有一个用于打开菜单的按钮,但是这个按钮只在3.0以上的版本才有。所以,如果要为这个按钮添加监听器,你可以这么做:

Button catButton = (Button) findViewById(R.id.categorybutton);
OnClickListener listener = /* create your listener here */;
if (catButton != null) {catButton.setOnClickListener(listener);
}

根据当前的布局做出响应

一些行为可能基于当前的布局产生不同的结果。比如说,在新闻阅读APP中,点击任意一条新闻标题,在多面板模式中,具体文章则会出现在右面板中,但是在单面板模式中,则会启动一个新的Activity来显示这些文章。

@Override
public void onHeadlineSelected(int index) {mArtIndex = index;if (mIsDualPane) {/* display article on the right pane */mArticleFragment.displayArticle(mCurrentCat.getArticle(index));} else {/* start a separate activity */Intent intent = new Intent(this, ArticleActivity.class);intent.putExtra("catIndex", mCatIndex);intent.putExtra("artIndex", index);startActivity(intent);}
}

同样的,如果APP当前处于多面板模式,那么应该设置带有tab的ActionBar用于导航,然而,在单面板模式下,就应当设置带有spinner的导航控件。所以代码中还应当检查当前是哪种情况:

final String CATEGORIES[] = { "Top Stories", "Politics", "Economy", "Technology" };
public void onCreate(Bundle savedInstanceState) {....if (mIsDualPane) {/* use tabs for navigation */actionBar.setNavigationMode(android.app.ActionBar.NAVIGATION_MODE_TABS);int i;for (i = 0; i < CATEGORIES.length; i++) {actionBar.addTab(actionBar.newTab().setText(CATEGORIES[i]).setTabListener(handler));}actionBar.setSelectedNavigationItem(selTab);}else {/* use list navigation (spinner) */actionBar.setNavigationMode(android.app.ActionBar.NAVIGATION_MODE_LIST);SpinnerAdapter adap = new ArrayAdapter(this, R.layout.headline_item, CATEGORIES);actionBar.setListNavigationCallbacks(adap, handler);}
}

重用Fragment

在设计多面板的应用时会反复出现的一个场景,有一部分UI在一种屏幕配置中以面板的形式出现,而在其它的配置中,又是以独立的Activity出现。

在类似这种情况下,你可以通过重用Fragment的方式来避免代码冗余。比如,ArticleFragment就用于多面板的情况:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal"><fragment android:id="@+id/headlines"android:layout_height="fill_parent"android:name="com.example.android.newsreader.HeadlinesFragment"android:layout_width="400dp"android:layout_marginRight="10dp"/><fragment android:id="@+id/article"android:layout_height="fill_parent"android:name="com.example.android.newsreader.ArticleFragment"android:layout_width="fill_parent" />
</LinearLayout>

在小屏幕中,又被Activity重用:

ArticleFragment frag = new ArticleFragment();
getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit();

上面的代码与在XML布局中声明Fragment含有相同的效果,但是这种情况下XML布局就没必要工作了,因为article Fragment作为了这个Activity的组件。

一个非常重要的点要记住,在设计Fragment时不要与指定的Activity产生强耦合。你可以通过定义接口的方式来使Fragment与宿主Activity产生交互,宿主Activity需要实现这个接口:

public class HeadlinesFragment extends ListFragment {...OnHeadlineSelectedListener mHeadlineSelectedListener = null;/* Must be implemented by host activity */public interface OnHeadlineSelectedListener {public void onHeadlineSelected(int index);}...public void setOnHeadlineSelectedListener(OnHeadlineSelectedListener listener) {mHeadlineSelectedListener = listener;}
}

因此,当用户选择了一条新闻时,Fragment通过接口的方式来通知宿主Activity:

public class HeadlinesFragment extends ListFragment {...@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {if (null != mHeadlineSelectedListener) {mHeadlineSelectedListener.onHeadlineSelected(position);}}...
}

处理屏幕配置变更

如果使用了单独的Activity实现了UI的独立部分,那么要记得响应某些配置的变化,比如屏幕旋转,以便保持UI的一致性。

比如说,一款运行Android 3.0系统的7英寸平板,新闻阅读APP在垂直模式下使用的是独立的Activity展示文章的内容,但是在水平模式下使用的是多面板模式。

如果用户当前处于垂直模式下,那么需要检查方向更改为了水平模式,并需要通过结束结尾Activity并返回MainActivity的方式来让内容展示于双面板模式:

public class ArticleActivity extends FragmentActivity {int mCatIndex, mArtIndex;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mCatIndex = getIntent().getExtras().getInt("catIndex", 0);mArtIndex = getIntent().getExtras().getInt("artIndex", 0);// If should be in two-pane mode, finish to return to main activityif (getResources().getBoolean(R.bool.has_two_panes)) {finish();return;}...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 - AAAI2020 | 基于知识图谱进行对话目标规划的开放域对话生成技术

论文笔记整理&#xff1a;张傲&#xff0c;天津大学硕士。Knowledge Graph Grounded Goal Planning for Open-Domain Conversation Generation来源&#xff1a;哈工大SCIR动机让机器生成有内容并且主题连贯的多轮开放域对话&#xff0c;是人工智能公认的关键任务之一。针对这一…

一个程序员的“无聊”故事

文 | Cat Chen知乎本文已获作者授权&#xff0c;禁止二次转载不同时期的生活方式是非常不一样的。我觉得最重要的是意识到这一点&#xff0c;不要以为某一种生活方式会一直延续下去。这个世界上不会存在特定的程序员生活方式&#xff0c;你在不同的公司工作就会遇到不一样的公司…

NLP算法岗一年半的工作总结--聊聊什么才是NLP算法工程师的核心竞争力

首发公众号:【 NLP从入门到放弃】--日常更新技术分享先简单自我介绍一下&#xff0c;我任职在一家社交公司&#xff0c;做NLP算法工程师&#xff0c;主要做文本分类&#xff0c;序列标注&#xff0c;文本相似度方向的工作&#xff0c;也做过搜索/推荐方向的需求。工作快有一年半…

LeetCode 349. 两个数组的交集(哈希)

1. 题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例 1:输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2] 示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出: [9,4] 说明:输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。来源&am…

Android官方开发文档Training系列课程中文版:创建自定义View之View的创建

原文地址&#xff1a;http://android.xsoftlab.net/training/custom-views/index.html 引言 Android框架含有大量的View类&#xff0c;这些类用来显示各式各样的数据&#xff0c;并可以直接与用户交互。但是某些时候&#xff0c;APP有一项很特殊的需求&#xff0c;但是框架中…

论文浅尝 | Iterative Cross-Lingual Entity Alignment Based on TransC

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士。来源&#xff1a;IEICE TRANSACTIONS on Information and Systems, 2020, 103(5): 1002-1005.链接&#xff1a;https://www.jstage.jst.go.jp/article/transinf/E103.D/5/E103.D_2019DAL0001/_pdf介绍这篇论文关注的任…

ARKit:增强现实技术在美团到餐业务的实践

前言 增强现实&#xff08;Augmented Reality&#xff09;是一种在视觉上呈现虚拟物体与现实场景结合的技术。Apple 公司在 2017 年 6 月正式推出了 ARKit&#xff0c;iOS 开发者可以在这个平台上使用简单便捷的 API 来开发 AR 应用程序。 本文将结合美团到餐业务场景&#xff…

腾讯天衍实验室新算法入选国际万维网大会 新冠疫苗AI问答上线

新冠疫苗的效用和安全性如何&#xff1f;怎么预约接种新冠疫苗&#xff1f;哪些人可以接种新冠疫苗&#xff1f;接种新冠疫苗是否收费&#xff1f;进入年底&#xff0c;随着全国新冠疫苗接种工作规范有序开展&#xff0c;各地接种人数在不断增加&#xff0c;但在逐步面向全民推…

百度一口气亮出NLP十年积累:完整技术布局全面披露,面向业界砸下11项七夕大礼

百度一口气亮出NLP十年积累&#xff1a;完整技术布局全面披露&#xff0c;面向业界砸下11项七夕大礼&#xff1a;https://zhuanlan.zhihu.com/p/197625888

Android官方开发文档Training系列课程中文版:创建自定义View之View的绘制

原文地址&#xff1a;http://android.xsoftlab.net/training/custom-views/custom-drawing.html#draw 自定义View最重要的部分就是它的样子了。自定义View的绘制根据应用的需要或者简单亦或者复杂。这节课的内容涵盖了大多数通用的知识点。 重写onDraw()方法 绘制自定义View…

LeetCode 965. 单值二叉树

文章目录1. 题目2. 解题2.1 递归2.2 循环1. 题目 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 2. 解题 2.1 递归 class Solution { public:bool isUnivalT…

论文浅尝 - SIAM ICDM 2020 | 基于图时空网络的知识引导的诊断预测

论文笔记整理&#xff1a;吴锐&#xff0c;东南大学硕士。来源&#xff1a;SIAM ICDM 2020论文下载地址&#xff1a;https://epubs.siam.org/doi/abs/10.1137/1.9781611976236.3 动机基于电子病历&#xff08;EHR&#xff0c;Electronic Health Records&#xff09;对患者未来的…

Oceanus:美团HTTP流量定制化路由的实践

背景 Oceanus是美团基础架构部研发的统一HTTP服务治理框架&#xff0c;基于Nginx和ngx_lua扩展&#xff0c;主要提供服务注册与发现、动态负载均衡、可视化管理、定制化路由、安全反扒、session ID复用、熔断降级、一键截流和性能统计等功能。本文主要讲述Oceanus如何通过策略抽…

对商品的评论进行数据挖掘得到评论标签(商品属性+评论观点),以及用户的分组信息

对商品的评论进行数据挖掘得到评论标签&#xff08;商品属性评论观点&#xff09;&#xff0c;以及用户的分组信息&#xff1a; 第一步&#xff1a;对文本进行预处理&#xff0c;分词并进行语义角色标注 # -*- coding:utf-8 -*- import os from pyltp import Segmentor, Post…

文本对抗攻击入坑宝典

文 | 阿毅编 | 小轶如果是咱家公众号的忠实粉丝就一定还记得之前咱家一篇关于NLP Privacy的文章&#xff0c;不出意外的话&#xff0c;你们是不是现在依然还担心自己的隐私被输入法窃取而瑟瑟发抖。所以&#xff0c;我们又来了&#xff01;今天给大家讨论的是NLP Privacy中一个…

Android官方开发文档Training系列课程中文版:创建自定义View之View的交互

写在前面的话:这一章很有价值&#xff0c;想要提升安卓知识的一定要读一读。不做安卓的也可以得到其它方面的提升。 原文地址&#xff1a;http://android.xsoftlab.net/training/custom-views/making-interactive.html UI的绘制只是自定义View的一部分。你还需要使View可以以…

LeetCode 350. 两个数组的交集 II(哈希)

文章目录1. 题目2. 解题2.1 hash2.2 数组已排序1. 题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例 1:输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2,2] 示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出: [4,9] 说明&#xff1a;输出结果中每个元…

会议交流 | CCKS2020 第十四届全国知识图谱与语义计算大会

CCKS2020第十四届全国知识图谱与语义计算大会China Conference on Knowledge Graph and Semantic Computing, 2020南昌.江西&#xff0c;11月12日-15日主办: 中国中文信息学会语言与知识计算专业委员会承办: 江西师范大学会议网站&#xff1a;www.sigkg.cn/ccks2020大会主题&a…

用微前端的方式搭建类单页应用

前言 微前端由ThoughtWorks 2016年提出&#xff0c;将后端微服务的理念应用于浏览器端&#xff0c;即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。 美团已经是一家拥有几万人规模的大型互联网公司&#xff0c;提升整体效率至关重要&#xff0c;这需要很…

Android官方开发文档Training系列课程中文版:创建自定义View之View的优化

原文地址&#xff1a;http://android.xsoftlab.net/training/custom-views/optimizing-view.html 现在已经完成了一个拥有良好设计的View&#xff0c;它即可以响应手势&#xff0c;又可以在状态之间过渡。为了避免View有卡顿的感觉&#xff0c;需要确保动画始终是按照每秒60帧…