Android螢幕適配解決方案
阿新 • • 發佈:2019-01-22
眾所周知,我們編寫的程式要在不同的裝置中執行,使客戶有完美的體驗效果,就需要對不同解析度的裝置作不同的是配方案,接下來以手機和平板為例進行是配方案,以新聞客戶端中新聞閱讀為例
(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>這樣就解決了不同裝置間的是配問題了,達到完美的客戶體驗效果
手機裝置下的程式執行效果圖:
平板裝置下的執行效果圖: