android开发笔记之不同机型的适配的解决方案(完整篇)
来源:互联网 发布:手机打击垫软件 编辑:程序博客网 时间:2024/05/17 00:57
现在,市场上android的机型太多,如何让自己的应用更多的适配不同的机型,这是一个非常现实的并且是要处理解决的问题。android官方给出的解决文档是从三个方向来分析处理的。
(1)支持不同屏幕大小的设备(Supporting Different Screen Sizes)
1.1 合理使用wrap_content,match_parent
1.2 尽可能的使用 RelativeLayout
1.3 针对不同的机型,使用不同的布局文件(Use Size Qualifiers):
res/layout/main.xml
res/layout-large/main.xml
1.4 尽量使用点9图片(Use Nine-patch Bitmaps)
(2)支持不同屏幕密度的设备(Supporting Different Screen Densities)
2.1 使用与密度无关的相素单位(Use Density-independent Pixels)-----dp,sp
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/clickme" android:layout_marginTop="20dp" />
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" />
2.2 对不同的设备提供可选择的图片(Provide Alternative Bitmaps)
不同分辨率之间的比例关系:
xhdpi: 2.0
hdpi: 1.5
mdpi: 1.0 (baseline)
ldpi: 0.75
awesomeimage.png图片位置的放置:
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
(3)实现自适应用户界面流(Implementing Adaptative UI Flows)
3.1 识别当前的布局文件是那个(Determine the Current Layout):这个主要是采用标志位的方式来得到当前使用的布局文件
public class NewsReaderActivity extends FragmentActivity { boolean mIsDualPane; @Override public 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; }}
针对当前布局文件没有的控件(eg:button),要对其进行判断是否为null:
Button catButton = (Button) findViewById(R.id.categorybutton);OnClickListener listener = /* create your listener here */;if (catButton != null) { catButton.setOnClickListener(listener);}
3.2 根据当前布局,使用不同的响应操作(React According to Current Layout)
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); }}
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); }}
3.3 在其它的activity中复用Fragments(Reuse Fragments in Other Activities):
在这一部分,android提供了一个解决同一操作,不同响应的解决方案,就是在父类中提供一个interface,在子类中实现interface,以实现不同的操作:
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; }}
public class HeadlinesFragment extends ListFragment { ... @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (null != mHeadlineSelectedListener) { mHeadlineSelectedListener.onHeadlineSelected(position); } } ...}
原始资料:
1.Designing for Multiple Screens:
http://developer.android.com/training/multiscreen/index.html
2.Supporting Different Screen Sizes:
http://developer.android.com/training/multiscreen/screensizes.html
3.Supporting Different Screen Densities:
http://developer.android.com/training/multiscreen/screendensities.html
4.Implementing Adaptative UI Flows:
http://developer.android.com/training/multiscreen/adaptui.html
参考资料:
1.
http://blog.csdn.net/hfreeman2008/article/details/9351687
- android开发笔记之不同机型的适配的解决方案(完整篇)
- 关键(一): android不同机型的适配的解决方案之按比例伸缩篇
- android适配不同机型需要注意的事项
- android知识回顾-----适配不同分辨率的机型
- android开发如何获得不同机型的SD卡路径
- Android 拍照不同机型的诡异问题
- Android中android:layout_weight属性解决不同机型平均分布的适配问题
- Android机型适配之鸿阳大神的autolayout
- Android不同机型图标适配问题
- android不同的定制系统的机型适配和不同版本系统api sdk的适配
- android 不同机型因录音权限出现的不同问题
- Android之机型适配
- Android Training学习笔记之适配不同的设备
- Android开发中的机型适配和国际化适配的实现;
- Android机型适配之密度独立
- Android机型适配之痛
- Android机型适配之痛
- Android机型适配之痛
- 数据库工具-DBeaver工具
- android 报错集锦
- MyBatis+Spring 事务管理
- 把十进制数转换成十六进制后如何分割高低字节
- Decode Ways
- android开发笔记之不同机型的适配的解决方案(完整篇)
- qt版本的浏览器开发
- OpenGL: 深度冲突(Z-Finghting or Depth Fighting)的解决
- Android 异步任务 AsyncTask
- Linux 压缩解压命令
- JavaScript判断浏览器类型及版本
- 2014-04-15第十六周周二工作日志:HKEY_CURRENT_USER
- 微软在线笔试第一题 复杂算法
- html5开发的web应用和iOS原生应用的关系