Android多屏适配完美方案,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

android:layout_height="wrap_content"

android:text="@string/clickme"

android:layout_marginTop="20dp" />

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:

2.Supporting Different Screen Sizes:

3.Supporting Different Screen Densities:

4.Implementing Adaptative UI Flows:

参考资料:

1.

原文:http://blog.csdn.net/hfreeman2008/article/details/23749007