Fragment的知识总结
1. Fragment概念及作用。
以下是使用Fragment提供思路
2. 创建继承于 Fragment的类:(可extends Fagment 或 ListFagment)
注意导包:如果考虑兼容就用 android.support.v4.app.ListFragment;
以下内容只是创建Fargment的例子
package ainux.bing.fragmentsingleactivity.Fragments; import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView; import java.util.Arrays;
import java.util.List; import ainux.bing.fragmentsingleactivity.Activitys.ContentActivity; /**
* A simple {@link Fragment} subclass.
*/
public class ListTitleFragment extends ListFragment { public static final int REQUEST_DETAIL = 0x110; private List<String> Mtitles= Arrays.asList("xiaobing", "like", "Android"); private ArrayAdapter<String> madapter;
private int mcurentPos; public ListTitleFragment() {
// Required empty public constructor
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(madapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,Mtitles));
} @Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id); mcurentPos=position; //跳转Activity
Intent intent = new Intent(getActivity(), ContentActivity.class);
//传值
intent.putExtra(ContentFragment.ARGUMENT, Mtitles.get(position));
startActivityForResult(intent,REQUEST_DETAIL); } //接收宿主Activity传递过来的数据
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("TAG", "onActivityResult");
if (requestCode==REQUEST_DETAIL) {
Mtitles.set(mcurentPos, Mtitles.get(mcurentPos) + "--" + data.getStringExtra(ContentFragment.RESPONSE));
madapter.notifyDataSetChanged();
} }
}
3. 在宿主Activity中的使用及传值方法
a.创建抽象类 继承 FragmentActivity(适用某一情况下)
红色 字体部分为 将Fragment加载到Activty中
package ainux.bing.fragmentsingleactivity.Activitys; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager; import ainux.bing.fragmentsingleactivity.R; public abstract class SingleFragmentActivity extends FragmentActivity { //创建fragment实例
protected abstract Fragment createFragment(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_single_fragment); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.id_fragment_container);
//将Fragment放在哪个布局中,id为布局ID //避免重新创建新的fragment(屏幕旋转的时候)
if (fragment == null) {
fragment = createFragment();
fm.beginTransaction().add(R.id.id_fragment_container, fragment).commit();
} } }
b. 创建实际应用的的activty 继承于 SingleFragmentActivity
package ainux.bing.fragmentsingleactivity.Activitys;
import android.support.v4.app.Fragment;
import ainux.bing.fragmentsingleactivity.Fragments.ListTitleFragment;
public class ListTitleActivity extends SingleFragmentActivity {
protected Fragment listFragment;
@Override
protected Fragment createFragment() {
listFragment = new ListTitleFragment();
return listFragment;
}
}
b . Fragment与它的Activity之间进行数据交换的方式。
1.Fragment中通过getActivity()然后进行强制转化,调用Activity中的公有方法(fun())
在Fragment中调用
((XXXXActivity)getActivity()).fun();
2.Activity在切换Fragment的时候,通过setArguments向Fragment传递参数,Fragment通过getArguments();获得从activity中传递过来的值
package ainux.bing.fragmentsingleactivity.Fragments; import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; import java.util.Random; /**
* A simple {@link Fragment} subclass.
*/
public class ContentFragment extends Fragment { public static final String ARGUMENT = "argument";
public static final String RESPONSE = "response";
private String mArgument; public ContentFragment() {
// Required empty public constructor
} /**
* 使用静态工厂方法实例化Fragment,并使用setArguments方法传值
* 使用setArguments的作用及好处参见:http://blog.csdn.net/tu_bingbing/article/details/24143249?utm_source=tuicool
* @param argument
* @return
*/
public static ContentFragment newInstance(String argument)
{
Bundle bundle = new Bundle();
bundle.putString(ARGUMENT, argument);
ContentFragment contentFragment = new ContentFragment();
contentFragment.setArguments(bundle);
return contentFragment;
} /**
*
* @param savedInstanceState
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); Bundle bundle = getArguments();
if (null!=bundle) {
mArgument = bundle.getString(ARGUMENT);
Intent intent = new Intent();
intent.putExtra(RESPONSE, "good");
getActivity().setResult(ListTitleFragment.REQUEST_DETAIL,intent);
}
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
Random random = new Random();
TextView tv = new TextView(getActivity());
tv.setText(mArgument);
tv.setGravity(Gravity.CENTER);
tv.setBackgroundColor(Color.argb(random.nextInt(100),
random.nextInt(255), random.nextInt(255), random.nextInt(255)));
return tv;
} }
在activity中,调用
package ainux.bing.fragmentsingleactivity.Activitys;
import android.support.v4.app.Fragment;
import ainux.bing.fragmentsingleactivity.Fragments.ContentFragment;
public class ContentActivity extends SingleFragmentActivity {
private ContentFragment contentFragment;
//实现抽象方法
@Override
protected Fragment createFragment() {
//通过静态工厂方法创建 Fragment实例
//将传递过来的值 赋值给Fragment
String stringExtra = getIntent().getStringExtra(ContentFragment.ARGUMENT);
contentFragment = ContentFragment.newInstance(stringExtra);
return contentFragment;
}
}
3.Activity实现一个接口,Fragment在onAttach方法中,将该Activity转化为该接口,在需要调用的时候回调。
你会经常想要一个fragment与另一个fragment通信,例如基于用户事件改变fragment中的内容。所有fragment质检单额通信都是通过Activity关联起来的。两个fragment之间不应该直接进行通信。
为了允许fragment和它的Activity通信,你应该fragment类中定义一个接口并在Activity中实现它。Fragment在onAttach()回调函数中获取接口的具体实现的对象。后面,fragment就可以调用接口中的方法实现与Activity的通信。
下面是一个Fragment一Activity通信的例子:
// 用来存放fragment的Activtiy必须实现这个接口
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
} @Override
public void onAttach(Activity activity) {
super.onAttach(activity); // 这是为了保证Activity容器实现了用以回调的接口。如果没有,它会抛出一个异常。
try {
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
现在fragment可以通过使用实现了OnHeadlineSelectedListener接口的mCallback实例调用onArticleSelected()方法(或其他在接口中的方法)将消息传递给Activity。
例如下面在fragment中的方法将会在用户点击一个List item的时候被调用。这个fragment使用回调接口将时间传递给父Activtity。
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// 发送时间给Activity宿主
mCallback.onArticleSelected(position);
}
为了接收从fragment传递过来的事件回调,宿主Activity必须实现定义在fragment类中的接口。
例如,下面的activity实现了上个例子中的接口。
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
... public void onArticleSelected(int position) {
// 用户选择了HeadlinesFragment中的头标题后
// 做一些业务操作
}
}
将消息传递给fragment
宿主Activity可以通过调用findFragmentById()方法获取Fragment实例,然后直接调用Fragment的公有方法,将消息传递给Fragment。
例如,想象一下,之前讲过的Activity可能包含有其他的fragment,而这些fragment通过上面的回调函数返回的接口动态地显示一些内容。这种情况下,Activity可以将回调函数中接收到信息传递给需要的fragment。
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
... public void onArticleSelected(int position) {
// 用户选中HeadlinesFragment中的头标题后
// 做一些必要的业务操作 ArticleFragment articleFrag = (ArticleFragment)
getSupportFragmentManager().findFragmentById(R.id.article_fragment); if (articleFrag != null) {
// 如果 article frag 不为空,那么我们在同时显示两个fragmnet的布局中... // 调用ArticleFragment中的方法去更新它的内容
articleFrag.updateArticleView(position);
} else {
// 否则,我们就是在仅包含一个fragment的布局中并需要交换fragment... // 创建fragment并给他一个跟选中的文章有关的参数
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // 用这个fragment替换任何在fragment_container中的东西
// 并添加事务到back stack中以便用户可以回退到之前的状态
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null); // 提交事务
transaction.commit();
}
}
}
Fragment的知识总结的更多相关文章
- Android开发之漫漫长途 XII——Fragment详解
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android开发之漫漫长途 XIII——Fragment最佳实践
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Fragment使用具体解释
fragment是Google在3.0版本号中推出的新功能,如今已经增加到V4包中,假设要使用V4兼容包中的Fragment须要将Activity换成FragmentActivity,调用的getSu ...
- 详细解读DialogFragment
原博客地址:http://www.cnblogs.com/tianzhijiexian/p/4161811.html 相信看这篇文章的人都应该知道android中的Dialog了吧,如果对于Dialo ...
- Android ToolBar
众所周知,在使用ActionBar的时候,一堆的问题:这个文字能不能定制,位置能不能改变,图标的间距怎么控制神马的,由此暴露出了ActionBar设计的不灵活.为此官方提供了ToolBar,并且提供了 ...
- Android开发之漫漫长途 XI——从I到X的小结
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android 5.x Theme 与 ToolBar 实战
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45303349: 本文出自:[张鸿洋的博客] 1.概述 随着Material D ...
- Scrum Meeting 11.04
成员 今日任务 明日计划 用时 徐越 学习Fragment相关知识,代码移植 代码移植 4h 赵庶宏 selvet移植,服务器配置,编写数据库 服务器配置,代码移植 4h 薄霖 学习安卓界面设计数据库 ...
- Android知识点总结
说明 当中大部分文章都是转载自其它大神之手.在转载的过程中学到了非常多,这里主要解说的是android体系的相关知识点,本文会持续更新. 1 Android service相关知识点 Android ...
随机推荐
- delphi 网络函数
Delphi网络函数 unit net; interfaceusessysutils,windows,dialogs,winsock,classes,comobj,wininet; //得到本机的局域 ...
- 由浅入深了解Thrift之客户端连接池化续
前文<由浅入深了解Thrift之客户端连接池化>中我们已经实现了服务调用端 连接的池化,实现的过于简陋,离实际的项目运用还很遥远.本文将在进一步改造,主要是两方面:1.服务端如何注册多个服 ...
- HDU3507 Print Article(斜率优化dp)
前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs. ...
- LoaderManager使用详解(二)---了解LoaderManager
了解LoaderManager 这篇文章将介绍LoaderManager类,这是该系列的第二篇文章. 一:Loaders之前世界 二:了解LoaderManager 三:实现Loaders 四:实 ...
- ThreadPoolTaskExecutor异步的处理报警发送邮件短信比较耗时的东东
package com.elong.ihotel.util; import org.springframework.beans.factory.DisposableBean; import org.s ...
- CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写
Q: CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写 A: 建议统一写,CI框架会自动识别已经加载过的类,所以不用担心重复加载的问题 class C_User ...
- Java-马士兵设计模式学习笔记-观察者模式-模拟Awt Button
一.概述 Java 的Awt是 Observer模式,现用Java自己模拟awt中Button的运行机制 二.代码 1.Test.java import java.text.DateFormat; i ...
- MAC终端配色Solarized
MAC终端配色Solarized $ git clone git://github.com/altercation/solarized.git 在 solarized/osx-terminal.app ...
- JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令
以下配置主要针对分代垃圾回收算法而言. 堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理 ...
- iOS:UIAlertController和UIAlertAction的详解
提示框控制器:UIAlertController 提示框按钮:UIAlertAction 功能:用来提示信息,并给出一些可以进行选择的按钮来处理相应的要求. 注意:在Xcode的iOS8 SD ...