Android学习之路-Fragment之二
来源:互联网 发布:drops软件官方下载 编辑:程序博客网 时间:2024/05/20 18:47
上篇学习了Fragment的静态和动态添加的简单使用,以及生命周期,为了更好的理解和使用fragment,本节结合实际应用,和大家分享fragment与activity之间以及与fragment之间的交互。
1、fragment与activity交互。
activity向fragment传递参数:
在提交事务实例化fragment时将参数传给fragment,在newInstance()方法里调用色图setArguments()将参数保存起来。
在oncreate()方法中getAraguments()将参数取出来使用。
fragment向activity传递参数:
这个采用了接口回调机制,在fragment里定义交互接口,让activity实现接口,fragment生命周期的
onAttach(Activity activity)里将activity强转为接口对象,得到接口实例,调用接口交互方法将参数传回给activity。
例子:
从效果图可以看出,左边是个fragment里面放了listView,点击Item可以将参数传递给Activity,Activiyt接收到参数后根据条件判断替换右边对应的framgent.并将参数传递给替换的fragment。
左边的fragemnt:xml文件:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="fragment_demo.fragment.FragmentTwo" android:background="@android:color/holo_blue_bright"> <ListView android:id="@+id/fragment_listview" android:layout_width="wrap_content" android:layout_height="wrap_content"/></FrameLayout>
package fragment_demo.fragment;import android.app.Activity;import android.app.Fragment;import android.content.Context;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.example.call.R;/** * A simple {@link Fragment} subclass. */public class FragmentTwo extends Fragment implements AdapterView.OnItemClickListener { private ListView mListView; private String[] data = new String[]{"新闻", "电影", "旅游"}; private OnCallBackInter mOnCallBackInter; /*注册与Activity交互的接口*/ public interface OnCallBackInter{ public void OngetMsg(String msg); } @Override /*交互接口*/ public void onAttach(Activity activity) { super.onAttach(activity); mOnCallBackInter = (OnCallBackInter)activity; //得到了实现接口的实例了 } /*返回Fragment实例*/ public static FragmentTwo newInstance(){ FragmentTwo fragmentTwo = new FragmentTwo(); return fragmentTwo; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_fragment_two_layout, container, false); mListView = (ListView) v.findViewById(R.id.fragment_listview); FragmentListAdapter adapter = new FragmentListAdapter(getActivity()); adapter.setDataStr(data); mListView.setAdapter(adapter); mListView.setOnItemClickListener(this); return v; } @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { String str = (String) adapterView.getAdapter().getItem(i); Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show(); mOnCallBackInter.OngetMsg(str); //将参数回传给Activity } public class FragmentListAdapter extends BaseAdapter { private String[] dataStr = new String[]{}; private LayoutInflater inflater; public FragmentListAdapter(Context context) { this.inflater = LayoutInflater.from(context); } public void setDataStr(String[] data) { this.dataStr = data; notifyDataSetChanged(); } @Override public int getCount() { return dataStr.length; } @Override public Object getItem(int i) { return dataStr[i]; } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if (view == null) { view = inflater.inflate(android.R.layout.simple_list_item_1, null); } TextView txt = (TextView) view; txt.setText((CharSequence) getItem(i)); return view; } }}fragment里传参数给activity,是通过接口回调的方式实现的。
右边的3个fragment几乎相同,这里指贴出一个。
xml布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_red_light"> <!-- TODO: Update blank fragment layout --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="电影Fragment" android:textSize="20sp" android:layout_centerInParent="true"/> <TextView android:id="@+id/movies_fragment_txt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:layout_alignParentBottom="true"/></RelativeLayout>
java代码:
package fragment_demo.fragment;import android.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import com.example.call.R;/** * A simple {@link Fragment} subclass. */public class MoviesFragment extends Fragment { private static final String ARG_PARAM1 = "param1"; private String mParam1; public MoviesFragment() { // Required empty public constructor } public static MoviesFragment newInstance(String str){ MoviesFragment fragment = new MoviesFragment(); Bundle bundle = new Bundle(); bundle.putString(ARG_PARAM1,str); fragment.setArguments(bundle); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(getArguments() != null){ mParam1 = getArguments().getString(ARG_PARAM1); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View v = inflater.inflate(R.layout.fragment_movies_layout, container, false); TextView txt = (TextView) v.findViewById(R.id.movies_fragment_txt); txt.setText(mParam1); return v; }}
可以看出,从Activity传参到Fragment相对简单,在生命周期对应方法写对应代码就可以了。
最后再来看看MainActivity里面做了写什么判断?
MainActivity 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"> <FrameLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:id="@+id/fragment_title_frameLayout"/> <FrameLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:id="@+id/fragment_content_framentlayout"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/fragment_showTxt" android:layout_gravity="center" android:background="@android:color/holo_purple"/> </FrameLayout></LinearLayout>
package fragment_demo.fragment;import android.app.Activity;import android.app.FragmentManager;import android.os.Bundle;import android.widget.TextView;import com.example.call.R;public class FragmentMainActivity extends Activity implements FragmentTwo.OnCallBackInter { private TextView mShowTxt; private FragmentManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment_main_layout); mShowTxt = (TextView) findViewById(R.id.fragment_showTxt); manager = getFragmentManager(); manager.beginTransaction().add(R.id.fragment_title_frameLayout, FragmentTwo.newInstance()).commit(); /*这里本应该注册接口的,但是Fragment里的OnAttach()方法已经实现了这一步*/ } @Override /*实现交互接口方法*/ public void OngetMsg(String msg) { if(msg.equals("新闻")) { manager.beginTransaction().replace(R.id.fragment_content_framentlayout, NewsFragment.newInstance(msg)).commit(); }else if (msg.equals("电影")){ manager.beginTransaction().replace(R.id.fragment_content_framentlayout,MoviesFragment.newInstance(msg)).commit(); }else if (msg.equals("旅游")){ manager.beginTransaction().replace(R.id.fragment_content_framentlayout,TravealFragment.newIntance(msg)).commit(); } }}
最后就实现了上面的效果。
0 0
- Android学习之路-Fragment之二
- android学习笔记之Fragment(二)
- Android Fragment系列学习笔记之二
- Android之Fragment学习(二)
- Android之Fragment(二)
- Android学习之路-fragment之三
- Android学习之 Fragment
- android学习之fragment
- Android学习之Fragment
- Android学习之Fragment
- Android学习之Fragment
- 一步一步学习Fragment之二
- Android之Fragment(二)
- Android学习笔记十.fragment(二) 之《图书详情》实战
- Android Fragment学习之二、Fragement的使用方法
- android学习之路--Fragment之一
- android学习笔记之Fragment
- Android学习笔记之fragment
- Android一些小知识-不定时更新
- 支持向量机,线性不可分和核函数
- Julia : csv =>hdf5
- 从大数据菜鸟走上大师的历程 Scala 第十四讲 package 访问权限
- UVa 10976 分数拆分
- Android学习之路-Fragment之二
- php安装memcache和memcached扩展
- observer in www.sharpexcel.com
- 基本类型与其包装类
- dos命令大汇总
- String
- Emacs笔记
- css 入门基础知识
- C如何通过被调函数修改主调函数普通变量的值