`
mixer_a
  • 浏览: 363919 次
社区版块
存档分类
最新评论

Android适配不同的屏幕[Lesson 3 - 实现可适配的UI流程]

阅读更多

Implementing Adaptative UI Flows [实现可适应的UI流程]

Depending on the layout that your application is currently showing, the UI flow may be different. For example, if your application is in the dual-pane mode, clicking on an item on the left pane will simply display the content on the right pane; if it is in single-pane mode, the content should be displayed on its own (in a different activity).
【根据显示不同的layout,我们需要设计不同的UI flow。比如如果你的AP是dual-pane的模式,点击左边list的item的时候,会在右边直接显示对应的内容,如果是single-pane的模式,那么需要跳转到另外一个Activity来显示对于的内容】

注:个人认为目前很多AP都会针对比较大的屏幕设计一个对于的版本,比如QQ Pad版,QQ HD版,QQ Pad Mini版,这些信息可以看出来大多数情况,还是不太会采取同一份代码适应所有屏幕的方案。
这一课主要就是讲如何在运行的时候判断当前的布局,从而让AP选择不同行为。

Determine the Current Layout [判断当前的布局]

Since your implementation of each layout will be a little different, one of the first things you will probably have to do is determine what layout the user is currently viewing. For example, you might want to know whether the user is in "single pane" mode or "dual pane" mode. You can do that by querying if a given view exists and is visible:
【显然,为了现实不同UI flow的设计,我们首先需要知道当前使用的是哪个布局,two-pane or single-pane,因为前面讲到系统会自动根据当前屏幕来选择显示对应的布局文件】
  • 方法一:我们可以查询对应的View是否存在并且可见来判断目前的布局是哪个
  1. public class NewsReaderActivity extends FragmentActivity {  
  2.     boolean mIsDualPane;  
  3.   
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main_layout);  
  8.   
  9.         View articleView = findViewById(R.id.article);  
  10.         mIsDualPane = articleView != null &&   
  11.                         articleView.getVisibility() == View.VISIBLE;  
  12.     }  
  13. }  

  • 方法二:我们可以判断某个组件是否存在来执行需要的操作(比如two-pane下没有categoryButton[因为two-pane下被actionBar替代],而single-pane下则有)
  1. Button catButton = (Button) findViewById(R.id.categorybutton);  
  2. OnClickListener listener = /* create your listener here */;  
  3. if (catButton != null) {  
  4.     catButton.setOnClickListener(listener);  
  5. }  

React According to Current Layout [根据当前布局有不同的反应]

Some actions may have a different result depending on the current layout. For example, in the News Reader sample, clicking on a headline from the headlines list opens the article in the right hand-side pane if the UI is in dual pane mode, but will launch a separate activity if the UI is in single-pane mode:
某些动作会根据当前的布局而有不同的反映。例如如果你的AP是dual-pane的模式,点击左边list的item的时候,会在右边直接显示对应的内容,如果是single-pane的模式,那么需要跳转到另外一个Activity来显示对于的内容
  1. @Override  
  2. public void onHeadlineSelected(int index) {  
  3.     mArtIndex = index;  
  4.     if (mIsDualPane) {  
  5.         /* display article on the right pane */  
  6.         mArticleFragment.displayArticle(mCurrentCat.getArticle(index));  
  7.     } else {  
  8.         /* start a separate activity */  
  9.         Intent intent = new Intent(this, ArticleActivity.class);  
  10.         intent.putExtra("catIndex", mCatIndex);  
  11.         intent.putExtra("artIndex", index);  
  12.         startActivity(intent);  
  13.     }  
  14. }  

Reuse Fragments in Other Activities [在其他Activities里重用Fragments]

某些时候,我们可以重用一些组件,比如in the News Reader sample, the news article text is presented in the right side pane on large screens, but is a separate activity on smaller screens.
In cases like this, you can usually avoid code duplication by reusing the same Fragment subclass in several activities. For example, ArticleFragment is used in the dual-pane layout:
[在这种情况下,我们可以重用同一个Fragment在若干个Activities里面而避免duplication.例如,ArticleFragment 被使用在dual-pane的布局里面]
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:orientation="horizontal">  
  5.     <fragment android:id="@+id/headlines"  
  6.               android:layout_height="fill_parent"  
  7.               android:name="com.example.android.newsreader.HeadlinesFragment"  
  8.               android:layout_width="400dp"  
  9.               android:layout_marginRight="10dp"/>  
  10.     <fragment android:id="@+id/article"  
  11.               android:layout_height="fill_parent"  
  12.               android:name="com.example.android.newsreader.ArticleFragment"  
  13.               android:layout_width="fill_parent" />  
  14. </LinearLayout>  

并且被重用在small screens里面
  1. ArticleFragment frag = new ArticleFragment();  
  2. getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit();  

显然,这样做的效果可以和声明一个布局文件效果一致,在这样的情况下,布局文件其实是另外一个Activity的组件,我们可以直接重复利用

One very important point to keep in mind when designing your fragments is to not create a strong coupling to a specific activity. You can usually do that by defining an interface that abstracts all the ways in which the fragment needs to interact with its host activity, and then the host activity implements that interface:
[当设计fragments的时候我们需要记住的是:不要为特定的activity创建一个强耦合的fragment,我们可以使用定义一个接口来和host activity进行交互]

For example, the News Reader app's HeadlinesFragment does precisely that:
  1. public class HeadlinesFragment extends ListFragment {  
  2.     ...  
  3.     OnHeadlineSelectedListener mHeadlineSelectedListener = null;  
  4.   
  5.     /* Must be implemented by host activity */  
  6.     public interface OnHeadlineSelectedListener {  
  7.         public void onHeadlineSelected(int index);  
  8.     }  
  9.     ...  
  10.   
  11.     public void setOnHeadlineSelectedListener(OnHeadlineSelectedListener listener) {  
  12.         mHeadlineSelectedListener = listener;  
  13.     }  
  14. }  

Then, when the user selects a headline, the fragment notifies the listener specified by the host activity (as opposed to notifying a specific hard-coded activity):
[这样,当用户点击头条项的时候,这个fragment会通知host activity的listener进行操作,在listener的onHeadlineSelected方法里面会进行当前布局的判断,从而选择合适的UI(是显示在右边还是另起一个activity)]
  1. public class HeadlinesFragment extends ListFragment {  
  2.     ...  
  3.     @Override  
  4.     public void onItemClick(AdapterView<?> parent,   
  5.                             View view, int position, long id) {  
  6.         if (null != mHeadlineSelectedListener) {  
  7.             mHeadlineSelectedListener.onHeadlineSelected(position);  
  8.         }  
  9.     }  
  10.     ...  
  11. }  

Handle Screen Configuration Changes [Handle屏幕配置的改变]

If you are using separate activities to implement separate parts of your interface, you have to keep in mind that it may be necessary to react to certain configuration changes (such as a rotation change) in order to keep your interface consistent.
[如果我们在使用分离的activity来实现不同的模块,那么为了保持UI的连续性,我们需要记住目前的配置信息]
For example, on a typical 7" tablet running Android 3.0 or higher, the News Reader sample uses a separate activity to display the news article when running in portrait mode, but uses a two-pane layout when in landscape mode.
[比如,在跑3.0或者更高版本系统的7“的平板上,News Reader会在竖屏的时候使用另外一个activity来打开文章详情,在横屏的时候使用two-pane的布局(直接显示在右边)]
  1. public class ArticleActivity extends FragmentActivity {  
  2.     int mCatIndex, mArtIndex;  
  3.   
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         mCatIndex = getIntent().getExtras().getInt("catIndex"0);  
  8.         mArtIndex = getIntent().getExtras().getInt("artIndex"0);  
  9.   
  10.         // If should be in two-pane mode, finish to return to main activity  
  11.         if (getResources().getBoolean(R.bool.has_two_panes)) {  
  12.             finish();  
  13.             return;  
  14.         }  
  15.         ...  
  16. }  

分享到:
评论

相关推荐

    Android-androidUI适配屏幕适配

    本篇文章将深入探讨如何进行Android UI的适配工作,确保应用在不同设备上都能呈现出良好的视觉效果和用户体验。 首先,理解Android的屏幕尺寸分类是关键。Android将屏幕尺寸分为四大类:小屏(small)、正常屏...

    android – 多屏幕适配相关--屏幕设置相关

    综上所述,Android开发者需要理解屏幕尺寸、密度的概念,掌握不同的布局策略和资源管理方式,才能有效地实现多屏幕适配。通过合理地利用Android提供的工具和库,可以确保应用在各种设备上都有出色的显示效果。

    Android多屏幕适配及样式-设计开发指导书

    随着移动互联网技术的发展,Android设备种类繁多,不同的品牌、型号、屏幕尺寸以及分辨率等特性导致了多屏幕适配成为Android开发中的一项重要挑战。本文旨在解决多屏幕适配问题,为设计师与开发者提供一套系统的解决...

    Android-AutoAndroidLayoutAndroid屏幕适配方案直接填写设计图上的像素尺寸即可

    AutoAndroidLayout是一款针对Android开发的智能布局解决方案,其核心特性在于允许开发者直接按照设计图上的像素尺寸进行编程,从而极大地简化了在不同屏幕尺寸设备上的适配问题。这个框架的目标是消除传统Android...

    安卓UI布局相关-Android多屏幕适配.rar

    在Android开发中,UI布局是应用用户界面设计的关键部分,尤其在面对各种尺寸和分辨率的设备时,实现多屏幕适配显得尤为重要。本资源“安卓UI布局相关-Android多屏幕适配.rar”可能包含了多种针对不同屏幕尺寸和密度...

    Android 屏幕适配工具

    综上所述,Android屏幕适配是一个多维度、系统性的工程,需要开发者结合多种技术手段来实现。AndroidScreenDemo这个示例项目可能包含了一些实际的代码和布局文件,供开发者学习和参考如何解决屏幕适配问题。通过深入...

    Android-今日头条屏幕适配方案终极版一个极低成本的Android屏幕适配方案

    综上所述,Android-今日头条屏幕适配方案终极版通过结合比例计算、响应式布局、资源目录适配以及第三方库等多种方法,实现了对不同设备的低成本、高效适配。对于任何希望提升Android应用跨设备兼容性的开发者来说,...

    Android多分辨率多密度下UI适配方案.

    Android 多分辨率多密度下 UI 适配方案 Android 设计之初就考虑到了 UI 在多平台的适配,它本身提供了...通过以上方法,可以实现 Android 应用程序在多分辨率多密度下的 UI 适配,提高应用程序的可移植性和用户体验。

    android-android-ui-design-patterns.rar_Android UI Design_Android

    8. **适配多分辨率和屏幕尺寸**:Android设备的屏幕尺寸和分辨率多样化,因此UI设计需考虑如何适应不同屏幕,使用比例单位(如dp和sp)和百分比布局是常用的方法。 9. **动画和过渡效果**:动画和过渡不仅可以提升...

    Android屏幕适配资源

    总结,"Android屏幕适配资源"提供了一种有效的方式,使得开发者能够快速地为多种Android设备实现屏幕适配。通过合理使用这套资源,可以显著降低开发难度,提高应用质量,确保在各种Android设备上呈现出良好的显示...

    android屏幕适配方案

    在Android开发中,屏幕适配是一项至关重要的任务,因为Android设备有着广泛的屏幕尺寸和分辨率,从小型手机到大型平板电脑不一而足。一个良好的屏幕适配方案能够确保应用程序在不同设备上显示一致且用户体验良好。...

    Android-解决Android适配问题

    Android设备种类繁多,屏幕尺寸、分辨率、硬件配置差异巨大,这使得应用在不同设备上的表现可能不尽相同。本篇文章将详细探讨如何解决Android的适配问题,以确保应用在各种设备上都能提供良好的用户体验。 首先,...

    Android-针对Android屏幕适配所整合的几种常用方案

    本篇文章将详细探讨几种常见的Android屏幕适配方案,帮助开发者解决不同设备间界面显示不一致的问题。 1. **使用比例单位(dp、sp)** Android提供了密度无关像素(dp)和可缩放像素(sp)作为尺寸单位。dp用于长度和...

    新版Android开发教程 笔记11--可视化UI设计DroidDraw

    Android设备的屏幕尺寸和分辨率差异较大,因此,一个好的UI设计需要考虑到不同设备的兼容性。在DroidDraw中,你可以预览设计在不同屏幕密度和尺寸下的效果,以确保应用在各种设备上都能良好显示。 此外,DroidDraw...

    Android12适配nanopc-t4-跑通AP6398SV-20231222-0905.7z

    【Android 12适配nanoPC-T4】 在Android操作系统的发展历程中,每个新版本的发布都伴随着性能提升、功能优化以及对硬件平台更广泛的支持。Android 12是谷歌推出的最新版本,它引入了一系列改进,包括用户界面的刷新...

    js实现适配不同的屏幕大小

    在js中实现屏幕适配,一个常见的方法是监听设备的resize事件,当用户旋转设备或调整浏览器窗口大小时,通过js代码动态调整网页的布局或样式。示例代码中使用了自执行函数,立即初始化屏幕大小的适应,并设置了事件...

    Android屏幕适配工具类

    Android系统通过dp(density-independent pixels)作为单位来实现不同密度屏幕的适配,dp是一个与设备像素密度无关的单位。但是,对于不同的屏幕尺寸,仅仅依赖dp是不够的,因为即使相同密度的屏幕,尺寸差异也可能...

    可以适配权限管理的android-support-v4-jar.rar

    eclipse进行权限管理适配,ContextCompat.checkSelfPermission()方法找不到,是因为android-support-v4版本低了,这个版本可以使用,亲测,替换掉原来的V4包就可以了。

    Android 处理HTML-HTML适配屏幕.pdf

    为了实现良好的屏幕适配,开发者需要充分理解Android的屏幕分类和资源管理机制,利用dp单位和比例缩放来设计可扩展的UI,同时配合WebView的特性处理HTML内容。此外,测试是确保适配成功的关键,开发者应该在多种真实...

    Android dimens sw 屏幕适配文件

    Android dimens sw 屏幕适配文件 values-sw300dp values-sw310dp values-sw320dp values-sw330dp values-sw340dp values-sw350dp values-sw360dp values-sw370dp values-sw380dp values-sw390dp values-sw400dp ...

Global site tag (gtag.js) - Google Analytics