现在的位置: 首页 > 综合 > 正文

兼容手机和平板的Fragment

2018年06月09日 ⁄ 综合 ⁄ 共 8348字 ⁄ 字号 评论关闭

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

  

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

 

具体实现步骤如下

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; 

 

    /**

     * ActivityFragment建立关联时,初始化适配器中的数据。

     */ 

    @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.javaSoundFragment.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.javaDisplayActivity.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例子就完成了。


源码下载


抱歉!评论已关闭.