Fragment 回退栈 传递参数,点击切换图片使用Fragment ListView
Fragment回退栈
类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化。
如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。
一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity。
transaction.add(R.id.right, rightFragment);
transaction.addToBackStack(null);
Fragment传递参数
1. Activity在构建Fragment的时候,向他传递参数setArguments(Bundle b); bundle可以携带基础数据类型,数组,以及序列化对象
2. Activity想xml中的Fragment传递数据
//找到xml中静态创建的Fragment
framgent = (ContentFragment)
getSupportFragmentManager().findFragmentByTag("fragment");
//findFragmentById(R.id.fragment);
3. Fragment之间传参 非常少
通过Activity作为桥梁,获取FragmentManager.findFragmentById(Tag)获取引用;
4. 任何的类都可以通过单例模式来获取数据
Android组件单例(View,Fragment,Activity,Application)都不允许构造方法私有化
必须保证该对象是单例的
Application由系统创建,已经保持了单例
Activity由系统创建,也保持了单例
但是Fragment由自己创建,并没有保持单例
步骤如下:
静态本类对象
static MainActivity instance;
公开访问方法
public static MainActivity getInstance() {
return instance;
}
在生命周期onCreate的时候 将静态本类对象赋值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
setContentView(R.layout.activity_main);
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.example.lesson10_backtostack.MainActivity"> <fragment
android:id="@+id/fragment2"
android:name="com.example.lesson10_backtostack.SingleFragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"/> <ListView
android:id="@+id/lv"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"/> <FrameLayout
android:id="@+id/fl_fragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5" />
</LinearLayout>
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher"/> </LinearLayout>
frag_layout.xml
public class SingleFragment extends Fragment {
ImageView img; public static SingleFragment newInstance(int imgId){
SingleFragment fragment = new SingleFragment();
Bundle bundle = new Bundle();
bundle.putInt("imgId",imgId);
fragment.setArguments(bundle);
return fragment;
} @Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.frag_layout, null);
img = (ImageView) layout.findViewById(R.id.img);
return layout;
} @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState);
Bundle bundle = getArguments();
if (bundle == null) {
img.setImageResource(R.mipmap.ic_launcher);
} else {
int imgId = bundle.getInt("imgId");
img.setImageResource(imgId);
}
img.setScaleType(ImageView.ScaleType.FIT_XY); //Fragment条用Activity的方法
MainActivity activity = (MainActivity) getActivity();
activity.showToast("这是Fragment调用Activity的方法");
} public void showToast(String msg) {
Log.e("TAG",msg);
Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
}
}
SingleFragment.java
public class MainActivity extends AppCompatActivity { int[] imgId = {R.mipmap.img01,R.mipmap.img02,R.mipmap.img03,R.mipmap.img04,R.mipmap.img05};
String[] name = {"朴海镇","宋慧乔","宋仲基","全智贤","杨幂"}; ListView lv;
SingleFragment fragment;
List<String> mList = new ArrayList<>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化数据
initData();
//初始化视图
initView();
initEvents();
SingleFragment fragment2 = (SingleFragment) getSupportFragmentManager().findFragmentById(R.id.fragment2);
fragment2.showToast("这是MainActivity调用Fragment的方法"); } private void initEvents() {
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
createFragment(position); FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fl_fragment,fragment);
ft.addToBackStack(null);
ft.commit();
}
});
} private void createFragment(int position) {
fragment = SingleFragment.newInstance(imgId[position]);
/*Bundle bundle = new Bundle();
bundle.putInt("imgId",imgId[position]);
fragment.setArguments(bundle);*/ } private void initView() {
lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new BaseAdapter() {
@Override
public int getCount() {
return mList.size();
} @Override
public Object getItem(int position) {
return mList.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = new TextView(getBaseContext());
}
TextView tv = (TextView) convertView;
tv.setPadding(20,20,20,20);
tv.setText(mList.get(position));
return tv;
}
});
createFragment(0);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.fl_fragment,fragment);
ft.commit(); } private void initData() {
for(int i=0;i<name.length;i++){
mList.add(name[i]);
}
} public void showToast(String msg){
Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT).show();
} }
MainActivity.java
Fragment 回退栈 传递参数,点击切换图片使用Fragment ListView的更多相关文章
- 清空Fragment回退栈中某个Fragment之上的所有Fragment
根据debug信息查看Fragment回退栈的情况,具体debug代码如下: int num = getActivity().getSupportFragmentManager().getBackSt ...
- jquery插件jquery.LightBox.js之点击放大图片并左右点击切换图片(仿相册插件)
该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的点击放大图片并左右点击切换图片的效果,您可以根据自己的实 ...
- 22.用demo通过点击切换图片路径
用demo通过点击切换图片路径 html: <img src="images/driving.png" class="driving"/> js: ...
- Android零基础入门第89节:Fragment回退栈及弹出方法
在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习. 一.回退栈 在前面两期的示例中,当我们完成一些操作后,如果想要回到操作之前的状 ...
- Fragment回退栈&commit()和commitAllowingStateLoss()
Activity切换时是通过栈的形式,不断压栈出栈,在Fragment的时候,如果你不是手动开启回退栈,它是直接销毁再重建,但如果将Fragment任务添加到回退栈,情况就会不一样了,它就有了类似Ac ...
- 清空Fragment回退栈中某个Fragment
出栈的方法:getActivity().getSupportFragmentManager().popBackStackImmediate(CreateOneFragment.class.getNam ...
- jquery 当前链接激活传递参数|div的切换显示
一.链接激活时传递参数 $("a").click(function(){ var obj=$(this).attr("field"); //获取当前field ...
- Fragment生命周期及实现点击导航图片切换fragment,Demo
PS:Fragment简介 Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会 ...
- 利用DOM的方式点击切换图片及修改文字
本案例主要学习理解,用到的几个DOM方法 01.getAttribute()方法,获取元素的属性值 02.setAttribute('src',source) 方法,用后边的值修改前边这个元素的属性值 ...
随机推荐
- nim
上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的. 亚当和夏娃在玩一个游戏,每次寻找边长为x的正方形,其中每个格子必须为黑色,然后将这些格子染白. 如果谁不能操作了,那么那个人就输了. ...
- Java jdk环境搭建
java JDK的配置在我的电脑环境变量中配置: 主要的配置参数path 例:path = C:\jdk1.7.0_13\bin ; 另外一个JAVA_HOME 例:JAVA_HOME = C:\j ...
- 一个IP支持多个网站实例(Apache2、Ubuntu相关)
http://www.blogjava.net/Andyluo/archive/2009/08/24/21821.html http://blog.csdn.net/zltianhen/article ...
- Ubuntu使用Xming和Putty
运行个复杂的,比如 gnome-session,这个是 GNOME 的启动命令,如果想打开 KDE 就是 startkde root@carlo-cloud:~# xlogoThe program ' ...
- Java多线程:常用的实现多线程的两种方式
之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程池的内容,我们以后会详细介绍;现在,先对的Thread和Runnable进行了解.本章内 ...
- LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意义及区别
引用 LPSTR.LPCSTR.LPTSTR.LPCTSTR.LPWSTR及LPCWSTR的意义及区别 1.ANSI(即MBCS):为多字节字符集,它是不定长表示世界文字的编码方式.ANSI表示英文字 ...
- A Simple problem
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2497 题意:给出顶点数,边数及节点s,判断s是 ...
- bzoj1135
POI阴影又发作了但这道题挺好的,比较涨知识裸的想法是裸的每次二分图匹配,但显然会TLE这里就要引入Hall定理:二分图G中的两部分顶点组成的集合分别为X, Y, X={X1, X2, X3,X4,. ...
- 【REST API】
微信公众平台开发者文档 RESTful API 设计最佳实践 登录判断写去接口里 PUT 新建一个资源POST 更新一个资源GET 查看一个资源DELETE 删除一个资源
- Qt入门(7)——窗口几何结构
QWidget提供了几个处理窗口几何结构的函数.这些函数中的几个操作纯客户区域(例如不包含窗口框架的窗口),其它一些包括窗口框架.它们之间的区别在某种意义上被完成覆盖明显地最普通的方法.包括窗口的框架 ...