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
- Android Fragment学习笔记
- android fragment学习笔记
- 学习笔记 android fragment
- android Fragment 学习笔记
- Fragment 学习笔记
- Fragment学习笔记
- Android学习笔记 - fragment
- Fragment学习笔记
- viewpager+fragment学习笔记
- Fragment学习笔记
- Fragment的学习笔记
- Fragment学习笔记
- 温故知新-Fragment学习笔记
- Fragment学习笔记
- Android学习笔记 Fragment
- Fragment 学习笔记
- Fragment学习笔记
- Fragment学习笔记
- SpriteKit实现的小游戏ColorAtom
- C++中 PASCAL关键字
- PowerManagerService笔记
- Oracle 删除重复数据只留一条
- 关于<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-sc..
- Fragment学习笔记
- Android虚拟机——Genymotion 配置问题
- 单例模式深入理解
- 算法复杂度的计算
- RadioButtonList控制行显示隐藏的问题
- 从客户端中检测到有潜在危险的 request.form值[解决方法]
- 排序算法总结 和 java和c++中 sort方法比较
- 指针与引用的区别
- 集成spring3、hibernate4、junit