- 浏览: 32675 次
- 性别:
- 来自: 深圳
文章分类
最新评论
为了适应Handset和Tablet等不同分辨率的android设备,google在android3.0之后提供了一个新的API,也就是Fragment,大家可以查阅官方SDK的详细说明。
以下是摘自官方SDK 的一张设计图,很好地展示了Fragment在兼容Tablet和Handset设备的设计理念。
首先解释一下,上述的设计原理。
1.针对Tablet,Activity A中包含了Fragment A和Fragment B,而Handset中的Activity A中只包含了Fragment A,至于Fragment B则通过对Fragment A的事件监听,来启动新的Activity B(包含Fragment B)将Fragment B显示给用户。
既然这样的话就必须用到两个布局,layout目录下默认存放的是Handset的布局,layout-large目录下存放的则是Tablet的布局。
更详细的请参考:http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html
2.接着看如何在布局中定义Fragment
参考一下配置文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <fragment class="com.test.fragment.ItemActivity" android:id="@+id/item" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="3" /> <fragment class="com.test.fragment.ContentActivity" android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> </LinearLayout>
3.系统内置了3种Fragment
DialogFragment:对话框式Fragment,管理模式类似与AlertDialog等对话框,允许用户返回之前的Fragment。
ListFragment:类似于ListActivity,并且提供了类似的功能,用法基本差不多。
PreferenceFragment:类似于PreferenceActivity,用法也差不多,可用来创建类似ipad的设置界面。
这里我们使用ListFragment来显示项目栏,内容栏通过Fragment来创建自定义布局。
直接上代码:
ItemActivity.java
package com.test.fragment; import com.test.fragment.R; import android.app.ListFragment; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class ItemActivity extends ListFragment{ private ItemAdapter adapter; private ImageView mLastIndicate = null; private Context mContext = null; private String [] mArr = null; private static OnItemChangeListener onItemChangeListener; public interface OnItemChangeListener{ void onItemChange(int position); } @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); mContext = getActivity(); mArr = new String[]{"item1","item2","item3"}; adapter = new ItemAdapter(); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); setListAdapter(adapter); } @Override public void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); if(mLastIndicate != null){ mLastIndicate.setVisibility(View.GONE); } ImageView imageView = (ImageView)v.findViewById(R.id.item_indicate); imageView.setVisibility(View.VISIBLE); mLastIndicate = imageView; onItemChangeListener.onItemChange(position); } public static void setItemChangeListener(OnItemChangeListener l){ onItemChangeListener = l; } public class ItemAdapter extends BaseAdapter{ private ViewHolder mHolder = null; public ItemAdapter(){ } public int getCount() { // TODO Auto-generated method stub return mArr.length; } public Object getItem(int position) { // TODO Auto-generated method stub return position; } public long getItemId(int position) { // TODO Auto-generated method stub return position; } public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView == null){ LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.item_layout, parent, false); mHolder = new ViewHolder(); mHolder.item_tv = (TextView)convertView.findViewById(R.id.item_tv); mHolder.item_indicate = (ImageView)convertView.findViewById(R.id.item_indicate); convertView.setTag(mHolder); }else{ mHolder = (ViewHolder)convertView.getTag(); } if(mLastIndicate == null){ if(position == 0){ mHolder.item_indicate.setVisibility(View.VISIBLE); mLastIndicate = mHolder.item_indicate; } } mHolder.item_tv.setText(mArr[position]); return convertView; } class ViewHolder{ public TextView item_tv; public ImageView item_indicate; } } }
在ItemActivity中设置onItemChangeListener监听器接口,在Item改变的时候,让MainActivity通过接口来刷新界面。
ContentActivity.java
package com.test.fragment; import com.test.fragment.R; import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; public class ContentActivity extends Fragment { private String [] arr = null; private String [] arr0 = {"item1:","item1:","item1:","item1:","item1:"}; private String [] arr1 = {"item2:","item2:","item2:","item2:","item2:"}; private String [] arr2 = {"item3:","item3:","item3:","item3:","item3:"}; private ContentAdapter adapter = null; private ListView lv = null; private Context mContext = null; @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Bundle bundle = getActivity().getIntent().getExtras(); int position = 0; if(bundle == null){ position = 0; }else{ position = bundle.getInt(MainActivity.KEY_POSITION); } switch(position){ case 0: arr = arr0; break; case 1: arr = arr1; break; case 2: arr = arr2; break; } mContext = getActivity(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view = inflater.inflate(R.layout.content_layout, container, false); lv = (ListView)view.findViewById(R.id.contentList); adapter = new ContentAdapter(); lv.setAdapter(adapter); return view; } public void onUpdateContent(int position){ switch(position){ case 0: arr = arr0; break; case 1: arr = arr1; break; case 2: arr = arr2; break; } adapter.notifyDataSetChanged(); } class ContentAdapter extends BaseAdapter{ private ViewHolder mHolder; public ContentAdapter(){ super(); } public int getCount() { // TODO Auto-generated method stub return arr.length; } public Object getItem(int position) { // TODO Auto-generated method stub return position; } public long getItemId(int position) { // TODO Auto-generated method stub return position; } public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView == null){ LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.content_item_layout, parent, false); mHolder = new ViewHolder(); mHolder.content_tv = (TextView)convertView.findViewById(R.id.content_tv); convertView.setTag(mHolder); }else{ mHolder = (ViewHolder)convertView.getTag(); } mHolder.content_tv.setText(arr[position]); return convertView; } class ViewHolder{ public TextView content_tv; } } }
MainActivity.java
package com.test.fragment; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import com.test.fragment.ItemActivity.OnItemChangeListener; import com.test.fragment.R; public class MainActivity extends Activity implements OnItemChangeListener{ private ContentActivity contentFragment = null; // private ItemActivity itemFragment = null; public static final String KEY_POSITION = "position"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); contentFragment = (ContentActivity)getFragmentManager().findFragmentById(R.id.content); ItemActivity.setItemChangeListener(this); } public void onItemChange(int position) { // TODO Auto-generated method stub if(contentFragment == null){ Intent intent = new Intent(this,Content.class); Bundle bundle = new Bundle(); bundle.putInt(KEY_POSITION, position); intent.putExtras(bundle); startActivity(intent); }else{ contentFragment.onUpdateContent(position); } } }
MainActivity的实现了OnItemChangeListener监听器接口,那么首先就要在onCreate的时候将监听器注册到ItemActivity中,在实现的方法中分别针对Tablet和Handset设备做了不同的处理。
欲知更多fragment的使用技巧,请参考官方SDK。
代码下载,请看附件。
- Fragment_test.zip (75.8 KB)
- 下载次数: 61
发表评论
-
webkit编译后无法输入中文的解决方法
2013-05-10 17:16 1597做如下修改即可: bool WebView::onIME ... -
android电话视频会议
2013-05-08 13:34 987开源android客户端项目linphone-androi ... -
android获取网络地址通用方法
2012-04-19 16:42 7409方法一:通过NetworkInterface获得所有网络 ... -
android4.0开发环境配置
2012-03-26 10:13 2019相信大家已经厌倦了eclipse自带的模拟器了吧 ... -
android之旅
2012-03-26 10:04 780快一年没有在这片小菜地耕耘过了,期间有乱七八糟的事情,有幸公司 ...
相关推荐
在这个"Android使用Fragment实现兼容手机和平板的程序demo"中,我们将探讨如何利用`Fragment`来构建适应多种设备的界面。 首先,`Fragment`是Android 3.0(API级别11)引入的一个新特性,主要是为了支持平板大屏...
Android使用Fragment实现兼容手机和平板的程序
"Fragment兼容手机与平板实现画廊3D和下拉列表"这个主题,涉及到的关键知识点包括Fragment的使用、多屏幕适配、3D画廊效果实现以及下拉列表的构建。 首先,Fragment是Android中的一个组件,它可以独立于Activity...
本教程将深入探讨如何使Fragment兼容手机和平板,以实现更灵活的界面布局。 1. **Fragment的基本概念** - Fragment是Android应用程序中的一个可重用组件,它可以在Activity中添加、删除或替换,提供了一种在不同...
"Fragment同时兼容手机平板"这个主题涉及到如何设计一个应用,使其能在不同尺寸的设备上,如手机和平板,提供良好的用户体验。以下是关于这个主题的详细知识点: 1. **Fragment的定义**:Fragment是一个可以包含UI...
本文将深入探讨如何使用Fragment配合底部菜单,通过show()和hide()方法来切换Fragment并保持其状态。 首先,让我们理解Fragment的基本概念。Fragment是一个可以包含UI组件的部分,它可以独立于Activity存在,也可以...
而"MyTabHostDemo"可能是一个使用TabHost和Fragment的演示项目,TabHost是Android早期用来实现标签页切换的组件,与Fragment结合使用可以创建多标签视图的应用。 总的来说,Fragment是Android开发中的重要工具,它...
这些布局可以在`res/layout`目录下以不同的文件名保存,如`fragment_phone.xml`和`fragment_tablet.xml`,并使用Android Studio的布局资源选择器根据屏幕尺寸自动选择。 2. **动态添加Fragment**:在Activity中,...
诚如其名,你可以把Fragment当作是Activity的模块化组件,它拥有自己的生命周期和UI,接受自身的处理事件,可以在Activity运行中被动态的添加、移除、替换。 Fragment必须被写成可重用的模块,你可以将多个Fragment...
`TabActivity`是早期Android版本中处理标签页的类,但随着Android SDK的发展,现在推荐使用`Fragment`和`ViewPager`来实现类似的功能。 `TabFragment`的实现主要基于以下几个关键知识点: 1. **Fragment**:`...
根据给定文件的信息,本文将详细介绍如何使用Android Fragment创建动态用户界面(UI)。Android Fragment是Android开发中的一个重要组件,它允许开发者在一个Activity中动态地组合多个片段来构成复杂的UI布局。 ...
本实例"Fragment实现tab"主要展示了如何使用Fragment和FragmentTabHost来创建一个带有标签切换功能的界面。接下来,我们将详细讨论Fragment以及如何使用它们来实现tab切换效果。 Fragment是Android 3.0(API级别11...
本项目“Fragment的嵌套和侧滑菜单DrawerLayout加标签页的使用demo”旨在演示如何在Android Studio中巧妙地结合Fragment、DrawerLayout以及SlidingTabLayout来创建一个功能丰富的应用界面。 首先,我们来详细解析每...
本教程将深入探讨如何使用Fragment实现类似QQ和微信那样的页面切换效果。 1. **Fragment基本概念** - Fragment是Android应用中的一个可重用的UI组件,它可以包含活动的部分用户界面,并能在Activity中动态添加、...
以上就是关于"Fragment嵌套Fragment实现多tab页面"项目的一些关键知识点,这个项目不仅展示了Fragment的使用,还涉及到界面设计、事件处理和性能优化等多个方面,对于提升Android开发技能非常有帮助。
本示例“动态使用Fragment简单示例”将详细介绍如何在运行时动态地添加和管理Fragment。 首先,我们需要理解Fragment的基本概念。Fragment是Android应用程序中的一个模块化组件,它可以在Activity中单独存在或者与...
本教程将深入探讨“静态使用Fragment”的概念、步骤和最佳实践。 首先,理解什么是静态使用Fragment。静态使用指的是在布局文件中直接定义Fragment,而不是在运行时动态添加或替换。这种方式适用于那些在应用启动时...
在这个"fragment使用"的项目中,我们重点讨论如何通过源码实现购物应用中的首页、发现、购物车和用户中心间的切换。 1. **Fragment的基本概念** - Fragment是一个可以添加到Activity中的UI模块,它可以有自己的...
可以通过在布局XML文件中定义<fragment>标签或者在代码中使用FragmentManager和Transaction来添加Fragment。例如,使用以下代码动态添加Fragment: ```java FragmentManager fragmentManager = ...