Fragment学习笔记

来源:互联网 发布:js酵瘦组合效果怎么样 编辑:程序博客网 时间:2024/05/19 14:55

Fragment的出现用来取代了TabHost,可理解为Activity片段,它必须被嵌入Activty中,并由该Activity控制其生命周期,它可以处理输入事件。

Fragment与Activity的关系:

  • 当Activity暂停时,内部的所有Fragment也会暂停,当Activity销毁时,内部的所有Fragment会销毁,只有当Activty处于活动状态时,才可以通过Activity来操作Fragment。
  • Fragment获取Activity:getActivity()
    Activity获取Fragment:调用FragmentManager的findFragmentById()或findFragmentByTag()方法来获取Fragmrnt
  • Activity操作Fragment:通过FragmentManager的add()、remove()、replace()方法动态添加、删除、替换Fragment。

一、创建Fragment

创建Fragment的方法与创建一个Activity类似(实际上它就是比Activity小一个级别的界面组件),通常要实现onCreate()、onCreateView、onPause()等方法。举例:

public class BookDetailFragment extends Fragment
{
public static final String ITEM_ID = "item_id";
BookContent.Book book;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (getArguments().containsKey(ITEM_ID))
{
book = BookContent.ITEM_MAP.get(getArguments().getInt(ITEM_ID)); //①
}
}
 
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_book_detail, container, false);
if (book != null)
{
((TextView) rootView.findViewById(R.id.book_title)).setText(book.title);
((TextView) rootView.findViewById(R.id.book_desc)).setText(book.desc);
}
return rootView;
}
}

记住其中LayoutInflater 的用法。
注意:onAttach()(Fragment被添加到Activity中)、onCreate()函数在生命周期中只会被调用一次。

二、Activity对Fragment的管理

1.在Activity中添加Fragment

两种方法:

  • 静态:在布局文件中添加<fragment>元素,其中android:name设置为指定Fragment的类名。
  • 动态:通过FragmentManager的FragmentTransaction对象的add(0方法来添加。(通常用getFragmentManager().beginTransaction()来获取FragmentTransaction)

2.数据传递

  • Activity向Fragment传递数据:创建Bundle数据包,通过Fragment的setArguments(Bundle)方法来传递数据。
  • Fragment向Activity传递数据:在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口,这样Fragment即可通过调用该回调方法将数据传递给Activity

3.管理Fragment

Activity主要依靠FragmentManager来管理Fragment:
主要功能:

  • 获取Fragment:findFragmentById()findFragmentByTag();
  • 将Fragment弹出栈(模拟返回键):popBackStack()
  • 注册监听器:addOnBackStackChangeListener()监听后台栈变化

另外一些操作则需要由FragmentTransaction(Fragment事务)来完成:

  • 添加:add()
  • 删除:remove()
  • 替换:replace()

注意在进行以上三个操作后,必须要调用commit()函数来提交。
当然,如果你希望通过返回键来返回到操作之前的状态,那么可以将上一个Fragment压入栈中,通过在commit之前调用addToBackStack()即可。

三、Activity操作Fragment举例(回调机制)

通过<fragment>标签把Fragment添加到Activity中:

<?xml version="1.0" encoding="utf-8"?>
<!-- 定义一个水平排列的LinearLayout,并指定使用中等分隔条 -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:divider="?android:attr/dividerHorizontal"
android:showDividers="middle">
<!-- 添加一个Fragment -->
<fragment
android:name="org.crazyit.app.BookListFragment"
android:id="@+id/book_list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<!-- 添加一个FrameLayout容器 -->
<FrameLayout
android:id="@+id/book_detail_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3" />
</LinearLayout>

ListFragment实现:

public class BookListFragment extends ListFragment
{
private Callbacks mCallbacks;
// 定义一个回调接口,该Fragment所在Activity需要实现该接口
// 该Fragment将通过该接口与它所在的Activity交互
public interface Callbacks
{
public void onItemSelected(Integer id);
}
 
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 为该ListFragment设置Adapter
setListAdapter(new ArrayAdapter<BookContent.Book>(getActivity(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1, BookContent.ITEMS));
}
 
// 当该Fragment被添加、显示到Activity时,回调该方法
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
// 如果Activity没有实现Callbacks接口,抛出异常
if (!(activity instanceof Callbacks))
{
throw new IllegalStateException(
"BookListFragment所在的Activity必须实现Callbacks接口!");
}
// 把该Activity当成Callbacks对象
mCallbacks = (Callbacks)activity;
}
 
// 当该Fragment从它所属的Activity中被删除时回调该方法
@Override
public void onDetach()
{
super.onDetach();
// 将mCallbacks赋为null。
mCallbacks = null;
}
 
// 当用户点击某列表项时激发该回调方法
@Override
public void onListItemClick(ListView listView
, View view, int position, long id)
{
super.onListItemClick(listView, view, position, id);
// 激发mCallbacks的onItemSelected方法
mCallbacks.onItemSelected(BookContent
.ITEMS.get(position).id);
}
}

主activity实现:

public class SelectBookActivity extends Activity
implements BookListFragment.Callbacks
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 加载/res/layout目录下的activity_book_twopane.xml布局文件
setContentView(R.layout.activity_book_twopane);
}
// 实现Callbacks接口必须实现的方法
@Override
public void onItemSelected(Integer id)
{
// 创建Bundle,准备向Fragment传入参数
Bundle arguments = new Bundle();
arguments.putInt(BookDetailFragment.ITEM_ID, id);
// 创建BookDetailFragment对象
BookDetailFragment fragment = new BookDetailFragment();
// 向Fragment传入参数
fragment.setArguments(arguments);
// 使用fragment替换book_detail_container容器当前显示的Fragment
getFragmentManager().beginTransaction()
.replace(R.id.book_detail_container, fragment) //最重要的一行代码
.commit(); //①
}
}
0 0
原创粉丝点击