android不同机型的适配的解决方案(完整篇)

现在,市场上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

[html]
  1. <Button android:layout_width=“wrap_content”   
  2.     android:layout_height=“wrap_content”   
  3.     android:text=“@string/clickme”  
  4.     android:layout_marginTop=“20dp” />  

 

[html]
  1. <TextView android:layout_width=“match_parent”   
  2.     android:layout_height=“wrap_content”   
  3.     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):这个主要是采用标志位的方式来得到当前使用的布局文件

[java]
  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. }  


针对当前布局文件没有的控件(eg:button),要对其进行判断是否为null:

[java]
  1. Button catButton = (Button) findViewById(R.id.categorybutton);  
  2. OnClickListener listener = /* create your listener here */;  
  3. if (catButton != null) {  
  4.     catButton.setOnClickListener(listener);  
  5. }  

 

3.2 根据当前布局,使用不同的响应操作(React According to Current Layout)

[java]
  1. public void onHeadlineSelected(int index) {  
  2.     mArtIndex = index;  
  3.     if (mIsDualPane) {  
  4.         /* display article on the right pane */  
  5.         mArticleFragment.displayArticle(mCurrentCat.getArticle(index));  
  6.     } else {  
  7.         /* start a separate activity */  
  8.         Intent intent = new Intent(this, ArticleActivity.class);  
  9.         intent.putExtra(“catIndex”, mCatIndex);  
  10.         intent.putExtra(“artIndex”, index);  
  11.         startActivity(intent);  
  12.     }  
  13. }  

 

[java]
  1. final String CATEGORIES[] = { “Top Stories”“Politics”“Economy”“Technology” };  
  2.   
  3. public void onCreate(Bundle savedInstanceState) {  
  4.     ….  
  5.     if (mIsDualPane) {  
  6.         /* use tabs for navigation */  
  7.         actionBar.setNavigationMode(android.app.ActionBar.NAVIGATION_MODE_TABS);  
  8.         int i;  
  9.         for (i = 0; i < CATEGORIES.length; i++) {  
  10.             actionBar.addTab(actionBar.newTab().setText(  
  11.                 CATEGORIES[i]).setTabListener(handler));  
  12.         }  
  13.         actionBar.setSelectedNavigationItem(selTab);  
  14.     }  
  15.     else {  
  16.         /* use list navigation (spinner) */  
  17.         actionBar.setNavigationMode(android.app.ActionBar.NAVIGATION_MODE_LIST);  
  18.         SpinnerAdapter adap = new ArrayAdapter(this,   
  19.                 R.layout.headline_item, CATEGORIES);  
  20.         actionBar.setListNavigationCallbacks(adap, handler);  
  21.     }  
  22. }  


3.3 在其它的activity中复用Fragments(Reuse Fragments in Other Activities):

在这一部分,android提供了一个解决同一操作,不同响应的解决方案,就是在父类中提供一个interface,在子类中实现interface,以实现不同的操作:

[java]
  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. }  

 

[java]
  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. }  



原始资料:

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

标签