手机上使用时效果图如下:

 

android 兼容target33 android 兼容手机和平板_布局文件

 

android 兼容target33 android 兼容手机和平板_布局文件_02

平板上使用时的效果图如下:


android 兼容target33 android 兼容手机和平板_xml_03

 

android 兼容target33 android 兼容手机和平板_布局文件_04

具体实现步骤如下

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; 
 
    /**
的适配器。
     */ 
    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" 
这是在手机上运行的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" 
这是在手机上运行的SoundActivity" 
        /> 
 
</LinearLayout>

 

由于当使用的设备是手机时进行的操作是Intent,所以还需要在AndroidMainfest.xml配置文件中添加对应的<activity/>,如下所示:

<activity android:name="zjh.android.activity.SoundActivity"/>
<activity android:name="zjh.android.activity.DisplayActivity"/>

 

此时,兼容手机和平板的Fragment例子就完成了。


源码下载