1. 程式人生 > >Android螢幕適配解決方案

Android螢幕適配解決方案

眾所周知,我們編寫的程式要在不同的裝置中執行,使客戶有完美的體驗效果,就需要對不同解析度的裝置作不同的是配方案,接下來以手機和平板為例進行是配方案,以新聞客戶端中新聞閱讀為例

(1)編寫再手機和平板中的不同佈局檔案

手機佈局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <fragment android:id="@+id/id_title_fragment"
android:layout_width="match_parent" android:name="com.chenbaige.screensetdemo.fragment.TitleFragment" android:layout_height="match_parent"> </fragment> </RelativeLayout>
平板佈局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/id_title_fragment" android:layout_width="0dp" android:layout_weight="2" android:name="com.chenbaige.screensetdemo.fragment.TitleFragment" android:layout_height="match_parent"> </fragment> <fragment android:id="@+id/id_content_fragment" android:name="com.chenbaige.screensetdemo.fragment.WelFragment" android:layout_width="0dp" android:layout_weight="3" android:layout_height="match_parent"></fragment> </LinearLayout>

(2)編寫展示新聞標題列表的fragment,繼承自ListFragment,便於展示列表
public class TitleFragment extends ListFragment {

    private List<String> Titles = new ArrayList<String>();
    private static ListViewSelectedListener mListener;

    public interface ListViewSelectedListener {
        public void selected(int positin);
    }

    public static void setOnItemSelectedListener(ListViewSelectedListener listener) {
        mListener = listener;
    }

    @Override
public void onListItemClick(ListView l, View v, int position, long id) {
        mListener.selected(position);}


    @Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        for (int i = 0; i < 30; i++) {
            Titles.add("新聞列表" + i);
        }
        setListAdapter(new BaseAdapter() {
            @Override
public int getCount() {
                return Titles.size();
            }

            @Override
public Object getItem(int position) {
                return Titles.get(position);
            }

            @Override
public long getItemId(int position) {
                return position;
            }

            @Override
public View getView(int position, View convertView, ViewGroup parent) {
                TextView tv=null;
                if(tv==null){
                    tv = new TextView(getActivity());
                }
                tv.setText(Titles.get(position));
                tv.setPadding(10, 10, 10, 10);
                tv.setTextSize(14);
                return tv;
            }
        });


    }

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = LayoutInflater.from(getActivity()).inflate(R.layout.title_fragment, null, false);
        return view;
    }
}

對應佈局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

    <ListView android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/holo_red_light"
android:dividerHeight="1dp"
android:background="#00FFf0"
/>


</RelativeLayout>

(3)編寫點選不同新聞標題,展示欣慰內容的fragment,為方便,點選不同標題的時候只顯示一行不同的文字,因此佈局中用一個textview填充
/**
 * Created by chenboge on 15/11/3.
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class WelFragment extends Fragment {

    private static TextView tv;

    public interface onTextViewClicklistener {

    }


    public static void SetContentText(String content) {
        tv.setText(content);
    }

    @Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = LayoutInflater.from(getActivity()).inflate(R.layout.content_fragment, null, false);
        tv = (TextView) view.findViewById(R.id.id_content_tv);
        return view;
    }
對應佈局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

    <TextView
android:id="@+id/id_content_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="hahahahaha" />


</RelativeLayout>
(4)接下來編寫程式啟動時的activity,如果是手機佈局,由於手機寬度有限,不便於展示內容,因此只顯示新聞標題列表,點選不同新聞標題後進入內容展示的ativity。如果是平板佈局,則採用左標題,右內容的形勢展示,便於良好的體驗效果
public class MainActivity extends Activity implements TitleFragment.ListViewSelectedListener {

    private boolean isTwoPanel;

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
//values資料夾下的layout.xml配置檔案
        setContentView(R.layout.main);
        initData();
    }

    private void initData() {
//從xml檔案中獲取當前是手機屏,或者平板螢幕,xml檔案會在接下來展示
        isTwoPanel = getResources().getBoolean(R.bool.ScreenShow);
//點選標題後的處理事件
        TitleFragment.setOnItemSelectedListener(this);

    }


    @Override
public void selected(int positin) {
        String s = "這是第" + positin + "個新聞內容";

        if (isTwoPanel) {
//平板模式,直接修改右側內容區域內容
            WelFragment.SetContentText(s);
        } else {
//手機屏,點選後跳轉到內容顯示介面
            Intent intent = new Intent(MainActivity.this, ShowContentActivity.class);
            intent.putExtra("content", s);
            startActivity(intent);
        }
    }
}
(5)接下來編寫手機屏下點選新聞標題後跳轉的activity,只用設定一下內佈局的現實內容即可
public class ShowContentActivity extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_content);
        WelFragment.SetContentText(getIntent().getStringExtra("content"));
    }


}
佈局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.chenbaige.screensetdemo.ShowContentActivity">

    <fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.chenbaige.screensetdemo.fragment.WelFragment"
android:id="@+id/id_content_fragment" />

</RelativeLayout>

(6)接下來是適配的重點了,建立不同的values資料夾,app啟動的時候會根據自身機型情況讀取不同values資料夾下的配置檔案,因此我們在這裡新建values-sw600dp資料夾,用於存放平板的配置檔案,在每個values資料夾下建立layout.xml配置檔案,具體如下
/values-sw600dp/layout.xml  裝置最小寬度為600p的時候讀區該配置檔案
<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
//R.layout.main就是讀取的activity_main_twopanel佈局檔案<item name="main" type="layout">@layout/activity_main_twopanel</item>
    <!-- 判斷是否是雙面板-->
<bool name="ScreenShow">true</bool>

</resources>
values/layout.xml  預設讀取的配置檔案
<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
<item name="main" type="layout">@layout/activity_main</item>
    <!-- 判斷是否是雙面板-->
<bool name="ScreenShow">false</bool>

</resources>
這樣就解決了不同裝置間的是配問題了,達到完美的客戶體驗效果
手機裝置下的程式執行效果圖:

平板裝置下的執行效果圖: