原文链接 http://www.cnblogs.com/nanxin/archive/2013/01/24/2875341.html

在本小节中介绍在Activity中创建Fragment。

官网有很详细的介绍http://developer.android.com/guide/components/fragments.html。介绍了Fragment的生命周期,Android3.0引入了Fragmen的概念,使UI灵活地适用于各种设备。具体原理就不多赘述了,请参考官网。

Fragment可以包含于多个Activity,可以使应用适配到不同的屏幕尺寸。当屏幕尺寸足够大时,一个Activity可以包含多个Fragment,不属于这种情况时,会启动另一个Activity包含不同的Fragment。

1 创建一个空的Activity

我们首先创建一个空的Activity,水平排列。如下所示

res/layour/main.xml:

<?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="horizontal" >
</LinearLayout>

com/fragment/FragmentDemoActivity.java:

package com.fragment;

import android.app.Activity;
import android.os.Bundle; public class FragmentDemoActivity extends Activity { /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

2 创建Fragment

我们创建两个Fragment,一个是目录TitlesFragment,一个是详情DetailsFragment。

TitlesFragment集成ListFragment,实现目录列表。

com/fragment/TitlesFragment.java:

package com.fragment;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.FragmentTransaction;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView; public class TitlesFragment extends ListFragment {
static String[] array; boolean mDualPane;
int mCurCheckPosition = 0; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
} @Override
public void onPause() {
super.onPause();
} @Override
public void onStop() {
super.onStop();
} @Override
public void onAttach(Activity activity) {
super.onAttach(activity);
} @Override
public void onStart() {
super.onStart();
} @Override
public void onResume() {
super.onResume();
} @Override
public void onDestroy() {
super.onDestroy();
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
array = getResources().getStringArray(R.array.countries_array);
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, array)); View detailsFrame = getActivity().findViewById(R.id.details); mDualPane = detailsFrame != null
&& detailsFrame.getVisibility() == View.VISIBLE; if (savedInstanceState != null) {
mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); //从保存的状态中取出数据
} if (mDualPane) {
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
showDetails(mCurCheckPosition);
}
} @Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);
} @Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
showDetails(mCurCheckPosition);
} void showDetails(int index) {
mCurCheckPosition = index;
if (mDualPane) {
getListView().setItemChecked(index, true);
DetailsFragment details = (DetailsFragment) getFragmentManager()
.findFragmentById(R.id.details);
if (details == null || details.getShownIndex() != index) {
details = DetailsFragment.newInstance(mCurCheckPosition); //得到一个fragment事务(类似sqlite的操作)
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
ft.replace(R.id.details, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();//提交
}
} else {
new AlertDialog.Builder(getActivity()).setTitle(
android.R.string.dialog_alert_title).setMessage(
array[index]).setPositiveButton(android.R.string.ok,
null).show();
}
} }

DetailsFragment显示点击某个目录的详情,com/fragment/DetailsFragment.java:

package com.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ScrollView;
import android.widget.TextView; public class DetailsFragment extends Fragment {
static String[] array; @Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
} public static DetailsFragment newInstance(int index) {
DetailsFragment details = new DetailsFragment();
Bundle args = new Bundle();
args.putInt("index", index);
details.setArguments(args);
return details;
} public int getShownIndex() {
return getArguments().getInt("index", 0);
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
if (container == null)
return null; array = getResources().getStringArray(R.array.countries_array); ScrollView scroller = new ScrollView(getActivity()); /*GridView gridview = (GridView) getActivity().findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(getActivity())); gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(DetailsFragment.this.getActivity(), " " + position, Toast.LENGTH_SHORT).show();
}
});*/ /*//定义UI组件
final ImageView iv= (ImageView)getActivity().findViewById(R.id.ImageView01);
Gallery g = (Gallery) getActivity().findViewById(R.id.Gallery01); //设置图片匹配器
g.setAdapter(new ImageAdapter(getActivity())); //设置AdapterView点击监听器,Gallery是AdapterView的子类
g.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//显示点击的是第几张图片
Toast.makeText(DetailsFragment.this.getActivity(), "" + position,
Toast.LENGTH_LONG).show();
//设置背景部分的ImageView显示当前Item的图片
iv.setImageResource(((ImageView)view).getId());
}
});*/ TextView text = new TextView(getActivity()); int padding = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 4, getActivity()
.getResources().getDisplayMetrics());
text.setPadding(padding, padding, padding, padding);
scroller.addView(text); text.setText(array[getShownIndex()]); /*Button btnContact = (Button) getActivity().findViewById(R.id.bt1);
btnContact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(getActivity(), MainHelloGallery.class);
startActivity(intent);
}
});*/ return scroller;
} /*@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu, inflater);
menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(getActivity(), "index is"+getShownIndex()+" && menu text is "+item.getTitle(), 1000).show();
return super.onOptionsItemSelected(item);
}*/
}

3 将Fragment添加至Activity中

此时,已经实现了Activity和两个Fragment,将Fragment添加至Activity有两种方式。

3.1 在activity的layout文件中声明fragment

<?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="horizontal" > <fragment
android:id="@+id/titles"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="0.31"
class="com.fragment.TitlesFragment" /> <FrameLayout android:id="@+id/details" android:layout_weight="1" android:layout_width="0px" android:layout_height="match_parent"
android:background="?android:attr/detailsElementBackground" >
</FrameLayout>
</LinearLayout>

3.2 在Activity中管理Fragment

在Activity中管理fragment, 需要使用FragmentManager. 通过调用activity的getFragmentManager()取得它的实例。

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);   FragmentManager fragmentManager = getFragmentManager();
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();   TitlesFragment titleFragment = new TitlesFragment();
  DetailsFragment detailsFragment = new DetailsFragment();
  fragmentTransaction.add(R.id.titles, titleFragment);
  fragmentTransaction.add(R.id.details, detailsFragment);
  fragmentTransaction.commit();
}

效果图如下:

Fragment在Activity中的应用 (转载)的更多相关文章

  1. Android ViewPager+Fragment 在Activity中获取Fragment的控件

    如果ViewPager+Fragment实现Tab切换,在activity中利用adapter.getItem获取到fragment然后再根据fragment.的方法获取控件 //隐藏求租,以下代码用 ...

  2. Fragment在Activity中跳转,实现类似新闻标题跳转新闻内容功能

    1.准备的工作,新闻数据类,新闻数据适配器,适配器的布局: News.java package com.example.zps.fourfragmentbestpractice; /** * Crea ...

  3. 多个Fragment在一个activity中通过按钮的展示方法

    fragment使用方法 1. 创建主Mainactivity extends AppCompatActivity 2. Oncreate & setContentView 3. 完成XML的 ...

  4. Android进阶(十二)Fragment VS Activity

    Fragment  VS  Activity Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这 ...

  5. Fragment、Activity比较——Android碎片介绍

    Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragmen ...

  6. Android进阶之Fragment与Activity之间的数据交互

    1 为什么 因为Fragment和Activity一样是具有生命周期,不是一般的bean通过构造函数传值,会造成异常. 2 Activity把值传递给Fragment 2.1 第一种方式,也是最常用的 ...

  7. [Android] Android Butterknife 8.8.1 在 Activity 和 Fragment 、 Adapter 中的使用

    ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.是大神JakeW ...

  8. android中fragment与activity之间通信原理以及例子

    参考文章 http://blog.csdn.net/guozh/article/details/25327685#comments Activity和fragment通信方式一般有3种方法 1.在fr ...

  9. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

随机推荐

  1. @Value 注解获取properties值

    转自:使用Spring 3的@value简化配置文件的读取 Spring 3支持@value注解的方式获取properties文件中的配置值,大简化了读取配置文件的代码. 1.在application ...

  2. VO , PO , BO , QO, DAO ,POJO

    VO , PO , BO , QO, DAO ,POJO, O/R Mapping 是 Object Relational Mapping (对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定 ...

  3. c#高级编程

    1..net才程序编译经过2步.首先把源代码编译成IL,这个是在visual studio中编译,然后是IL编译成机器语言,这个是在程序执行的时候进行的.

  4. javascript小数乘法精确率问题

    做前端页面开发的经常会遇到数值的乘法计算,带小数位计算会出现值溢出的问题,如: JS里做小数的乘法运算时会出现浮点错误,具体可以测试一下: <script>alert(11*22.9)&l ...

  5. Xcode6无法用xib得问题解决方法

    1.创建一个新工程,选择singleView application 2.将storyboard和launchscreen删除,选择moveToTrash 3.删除info.plist文件中Main ...

  6. org.hibernate.PropertyNotFoundException: Could not find a getter for employee in class com.itcast.f_hbm_oneToMany.Department

    <hibernate-mapping package="com.itcast.f_hbm_oneToMany"> <class name="Depart ...

  7. Toolbar Painter 工具条制作

    工具条制作工具(ToolBarPainter2013.exe),专为程序猿设计,界面开发必备.当用VC编程制作工具条时,需要为工具栏上每一个button添加图标,是一件极其繁琐的事情,该工具可利用已有 ...

  8. 'customerService' for bean class [com.cd.service.business.customer.impl.CustomerService]

    'customerService' for bean class [com.cd.service.business.customer.impl.CustomerService] 此处报错是因为我 把一 ...

  9. spring @Component

    使用 @Component <context:component-scan base-package="dao" />   虽 然我们可以通过@Autowired或@R ...

  10. 【贪心】 poj 1032 和为n的若干数最大乘积

    给出n,把n分解为若干不相同数之和,使之乘积最大.贪心,Discuss里面的思路:把n分解为从2开始的连续整数,如果有多,则从高位开始依次加1.如26,我们得到2+3+4+5+6,此时还剩余6(26- ...