手机上使用时效果图如下:
|
平板上使用时的效果图如下:
具体实现步骤如下
1)、新建一个项目工程,然后在其下的res目录下新建一个layout-large文件夹,然后在此文件夹下创建一个与主布局文件名字相同的布局文件,该布局文件用于当android检测到使用的设备是平板时加载。代码如下:
<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" android:orientation="horizontal">
<fragment android:id="@+id/menu_fragment" android:layout_width="0dip" android:layout_weight="1.0" android:layout_height="match_parent" android:name="zjh.android.fragment.MenuFragment"/>
<FrameLayout android:id="@+id/detail_layout" android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="2">
</FrameLayout>
</LinearLayout>
|
2)、在res目录下的layout文件夹中的activity_main.xml主布局文件,用于当android检测到的使用的设备是手机时加载,具体代码如下:
<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" android:orientation="vertical">
<fragment android:id="@+id/menu_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:name="zjh.android.fragment.MenuFragment"/>
</LinearLayout>
|
3)、在zjh.android.fragment包下新建一个继承自Fragment父类的MenuFragment.java类,用于判断用户使用的是何种设备,并进行相应的操作,具体实现代码如下:
package zjh.android.fragment;
import zjh.android.activity.DisplayActivity; import zjh.android.activity.SoundActivity; import zjh.android.main.R; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Fragment; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast;
@SuppressLint("NewApi") public class MenuFragment extends Fragment implements OnItemClickListener{ /** * 菜单界面中只包含了一个ListView。 */ private ListView menuList;
/** * ListView的适配器。 */ private ArrayAdapter<String> adapter;
/** * 用于填充ListView的数据,这里就简单只用了两条数据。 */ private String[] menuItems = { "Sound", "Display" };
/** * 是否是双页模式。如果一个Activity中包含了两个Fragment,就是双页模式。 */ private boolean isTwoPane;
/** * 当Activity和Fragment建立关联时,初始化适配器中的数据。 */ @Override public void onAttach(Activity activity) { super.onAttach(activity); adapter = new ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, menuItems); }
/** * 加载menu_fragment布局文件,为ListView绑定了适配器,并设置了监听事件。 */
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.menu_fragment, container, false); menuList = (ListView)view.findViewById(R.id.menu_list); menuList.setAdapter(adapter); menuList.setOnItemClickListener(this); return view; }
/** * 当Activity创建完毕后,尝试获取一下布局文件中是否有details_layout这个元素,如果有说明当前 * 是双页模式,如果没有说明当前是单页模式。 */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(getActivity().findViewById(R.id.detail_layout)!=null){ isTwoPane = true; }else{ isTwoPane = false; } }
/** * 处理ListView的点击事件,会根据当前是否是双页模式进行判断。如果是双页模式,则会动态添加Fragment。 * 如果不是双页模式,则会打开新的Activity。 */
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if(isTwoPane){ Fragment fragment = null; if(position==0){ fragment = new SoundFragment(); }else if(position==1){ fragment = new DisplayFragment(); } getFragmentManager().beginTransaction().replace(R.id.detail_layout, fragment).commit(); }else{ Intent intent = null; if(position==0){ intent = new Intent(getActivity(),SoundActivity.class); Toast.makeText(getActivity(), "false", Toast.LENGTH_SHORT).show(); }else if(position==1){ intent = new Intent(getActivity(),DisplayActivity.class); } startActivity(intent); } }
}
|
4)、建立两个继承自Fragment父类的DisplayFragment.java和SoundFragment.java类用于当使用的设备为平板时加载相应操作的布局文件,具体的代码如下:
package zjh.android.fragment;
import zjh.android.main.R; import android.annotation.SuppressLint; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;
@SuppressLint("NewApi") public class DisplayFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.display_fragment, container, false); return view; } } |
package zjh.android.fragment;
import zjh.android.main.R; import android.annotation.SuppressLint; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;
@SuppressLint("NewApi") public class SoundFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.sound_fragment, container, false); return view; } }
|
5)、在res目录下新建两个用来在平板设备上加载的布局文件,具体实现代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00ff00" android:orientation="vertical" >
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="28sp" android:textColor="#000000" android:text="This is sound view" />
</RelativeLayout>
|
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0000ff" android:orientation="vertical" >
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="28sp" android:textColor="#000000" android:text="This is display view" />
</RelativeLayout> |
6)、新建两个继承自Activity父类的SoundActivity.java和DisplayActivity.java的子类,用于当使用的设备为手机时加载相应操作的布局文件,具体实现代码如下:
package zjh.android.activity;
import zjh.android.main.R; import android.app.Activity; import android.os.Bundle;
public class SoundActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.sound_activity); } } |
package zjh.android.activity;
import zjh.android.main.R; import android.app.Activity; import android.os.Bundle;
public class DisplayActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.display_activity); } } |
接下来就是在res目录下新建两个用于当使用的设备是手机时被加载的布局文件,其代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="28sp" android:text="这是在手机上运行的DisplayActivity" />
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="28sp" android:text="这是在手机上运行的SoundActivity" />
</LinearLayout> |
由于当使用的设备是手机时进行的操作是Intent,所以还需要在AndroidMainfest.xml配置文件中添加对应的<activity/>,如下所示:
<activity android:name="zjh.android.activity.SoundActivity"/> <activity android:name="zjh.android.activity.DisplayActivity"/> |
此时,兼容手机和平板的Fragment例子就完成了。