"Fragment"-Android面试必问"精华技能点"汇总
来源:互联网 发布:python io模块 编辑:程序博客网 时间:2024/05/18 00:03
Fragment技能点汇总总结:
目录:
- 一Fragment跟Activity如何传值
- 一getActivity
- 二setArgumentsBundle
- 二描述Fragment的生命周期
- 一生命周期图
- 二需求
- 三代码
- 三Fragment的replace和add方法的区别
- 两者比较和注意点
- 四Fragment如何实现类似Activity的压栈和出栈效果
一.Fragment跟Activity如何传值?
一.getActivity()
- 1.从Fragment获取Ativity的信息
- 2.就可以调用Ativity的方法了
二.setArguments(Bundle)
- 在Ativity获取Fragment的实例和方法
过程和代码如下:
1.获取管理者
FragmentManager fragmentManager = getFragmentManager();
2.找到fragment
Fragment fragment = fragmentManager.findFragmentByTag(tag);Fragment fragment = fragmentManager.findFragmentById(id);
3.一般直接管理对象.获取事物(替换布局,frgmentXX).提交.
- 可调用fragment的setArguments(bundle)把数据绑定到Fragment中.
- 为什么官方推荐 Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不推荐通过构造方法直接来传递参数呢? 请看以下两个例子:
案例一:通过fragment构造传给Activity
public class FramentTestActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new TestFragment("param")).commit(); } } public static class TestFragment extends Fragment { private String mArg = "non-param"; public TestFragment() { Log.i("INFO", "TestFragment non-parameter constructor"); } public TestFragment(String arg){ mArg = arg; Log.i("INFO", "TestFragment construct with parameter"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); TextView tv = (TextView) rootView.findViewById(R.id.tv); tv.setText(mArg); return rootView; } }}
结果: 能正常显示
当横屏后:得到的值为null
案例二:换成setArguments(bundle)传递值
public class FramentTest2Activity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout. activity_main); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id. container, TestFragment.newInstance("param")).commit(); } } public static class TestFragment extends Fragment { private static final String ARG = "arg"; public TestFragment() { Log. i("INFO", "TestFragment non-parameter constructor" ); } public static Fragment newInstance(String arg){ TestFragment fragment = new TestFragment(); Bundle bundle = new Bundle(); bundle.putString( ARG, arg); fragment.setArguments(bundle); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout. fragment_main, container, false); TextView tv = (TextView) rootView.findViewById(R.id. tv); tv.setText(getArguments().getString( ARG)); return rootView; } }}
不论横屏还是竖屏都会得到值
二.描述Fragment的生命周期
一.生命周期图:
二.需求
- 1.屏幕分左右边,左边2/5是点击列表,右边是:上输入框,下文本框
- 2.最后一个内容fragment,多了个点击按钮.并能获取Activity里的输入框信息.
- 3.效果图如下图1,2,3
三.代码:
布局:
activity_main.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" > <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:background="#22ff0000" android:orientation="vertical"> <Button android:id="@+id/bt_news" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="新闻"/> <Button android:id="@+id/bt_fun" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="娱乐"/> <TextView android:id="@+id/tv_sport" android:layout_width="match_parent" android:layout_height="40dp" android:background="#22000000" android:gravity="center" android:text="体育"/> </LinearLayout><LinearLayout android:orientation="vertical" android:layout_width="0dp" android:layout_weight="5" android:layout_height="match_parent"> <EditText android:id="@+id/et_info" android:layout_width="match_parent" android:hint="请输入内容" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/fl_content" android:background="#2200ff00" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout></LinearLayout></LinearLayout>
fragment_fun.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> <TextView android:background="#33ff00f7" android:gravity="center" android:text="我是娱乐" android:layout_width="match_parent" android:layout_height="match_parent"/></LinearLayout>
fragment_news.xml
android:background="#330000ff"android:text="我是新闻"
fragment_sport.xml
<Button android:onClick="getInfo" android:id="@+id/bt_getInfo" android:text="获取输入框内容" android:layout_width="match_parent" android:layout_height="wrap_content"/><Button android:onClick="goFun" android:id="@+id/bt_goFun" android:text="跳到Fun板块" android:layout_width="match_parent" android:layout_height="wrap_content"/><TextView android:gravity="center" android:text="我是运动" android:layout_width="match_parent" android:layout_height="match_parent"/>
Java代码:
(分类写)
Fragment_fun.java
public class Fragment_fun extends Fragment { //1.固定 @Override public void onAttach(Context context) { Log.d("abce", "onAttach"); super.onAttach(context); } //2.创建 @Override public void onCreate(Bundle savedInstanceState) { Log.d("abce", "onCreate"); super.onCreate(savedInstanceState); } //3.创建View @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d("abce", "onCreateView"); //填充布局进来 return inflater.inflate(R.layout.fragment_fun,null); } //4.创建活动界面 @Override public void onActivityCreated(Bundle savedInstanceState) { Log.d("abce", "onActivityCreated"); super.onActivityCreated(savedInstanceState); } @Override public void onDestroyView() { Log.d("abce", "onDestroyView"); super.onDestroyView(); } @Override public void onDestroy() { Log.d("abce", "onDestroy"); super.onDestroy(); } @Override public void onDetach() { Log.d("abce", "onDetach"); super.onDetach(); }}
Fragment_news.java
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d("abce", "onCreateView"); //填充布局 return inflater.inflate(R.layout.fragment_news,null);}
Fragment_sport.java
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d("abce", "onCreateView"); View view =inflater.inflate(R.layout.fragment_sport,null); mBt_getInfo = (Button) view.findViewById(R.id.bt_getInfo); mBt_getInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //通过getActivity()方法获取到绑定的Activity对象 EditText et = (EditText) getActivity().findViewById(R.id.et_info); String str = et.getText().toString().trim(); if (TextUtils.isEmpty(str)) { Toast.makeText(getActivity(), "null", Toast.LENGTH_SHORT).show(); return; } Toast.makeText(getActivity(),"获取到的信息是"+str,Toast.LENGTH_SHORT).show(); } }); Button goA = (Button) view.findViewById(R.id.bt_goFun); goA.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getFragmentManager().beginTransaction().replace(R.id.fl_content, new Fragment_fun()).commit(); } }); return view;}
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button mBt_news; private Button mBt_fun; private TextView mTv_sport; private FragmentTransaction mFt; private FragmentManager mFm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); initView(); } private void init() { // 获取管理对象 mFm = getFragmentManager(); // 获取事物 mFt = mFm.beginTransaction(); // 开始的时候马上替换,帧布局先放new模块; mFt.replace(R.id.fl_content, new Fragment_news()); // 提交 mFt.commit(); } private void initView() { mBt_news = (Button) findViewById(R.id.bt_news); mBt_fun = (Button) findViewById(R.id.bt_fun); mTv_sport = (TextView) findViewById(R.id.tv_sport); mBt_news.setOnClickListener(this); mBt_fun.setOnClickListener(this); mTv_sport.setOnClickListener(this); } /** * 各个板块的点击事件: 每点击一个,创建一个: 1.管理 2.事务 3.事务替换内容 4.提交 */ @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt_news: getFragmentManager().beginTransaction().replace(R.id.fl_content, new Fragment_news()).commit(); break; case R.id.bt_fun: getFragmentManager().beginTransaction().replace(R.id.fl_content, new Fragment_fun()).commit(); break; case R.id.tv_sport: getFragmentManager().beginTransaction().replace(R.id.fl_content, new Fragment_sport()).commit(); break; } }}
三.Fragment的replace和add方法的区别
- 严格意义上讲不是fragment的方法,而是管理者的方法
- 常用:比如RadioGroup切换Fragment(每个Fragment都是一个独立的功能模块)
两者比较和注意点:
- 1.add的时候可以把Fragment 一层层添加到FrameLayout上面,而replace是删掉其他并替换
- 2.一个FrameLayout只能添加一个Fragment种类,多次添加会报异常,replace则随便替换
- 替换(上一个fragment会->destroyView和destroy,新的Fragmetnon:三个Create(crete+view+activity)->onStart->onResume)
- 3.因FrameLayout容器对每个Fragment只能添加一次,所以到达到效果可用fragment的hide和show方法结合.
四.Fragment如何实现类似Activity的压栈和出栈效果?
- 内部维持的是双向链表结构
- 该结构可记录我们每次的add和replace我们的Fragment;
- 当我们点击back按钮会自动帮我们实现退栈按钮
0 0
- "Fragment"-Android面试必问"精华技能点"汇总
- "Android 布局"-面试必问"精华技能点"汇总.
- "ListView "-Android面试必问"精华技能点"汇总.
- "Intent"-Android面试必问"精华技能点"汇总
- "Android中的访问网络"-Android面试必问"精华技能点"汇总
- "Android 性能优化"-Android面试必问"精华技能点"汇总
- "Android 屏幕适配"-Android面试必问"精华技能点"汇总
- "Android Touch事件分发机制"-Android面试必问"精华技能点"汇总
- "Android中的动画"-Android面试必问"精华技能点"汇总
- "Android自定义控件"-Android面试必问"精华技能点"汇总
- "Android-事件处理机制"之面试必问技能点汇总
- "Activity"-安卓面试必问技能点大总结"
- "Service"-安卓面试必问技能点大总结"
- "BroadcastReceiver"-安卓面试必问技能点大总结"
- android面试技能点
- 面试必问
- 面试必问
- 前端面试必问
- 【Linux】FrameBuffer操作入门
- js 中对象的特性
- js如何加注释啊
- Ubuntu下安装软件的几种方式
- 关于STL的一些写法
- "Fragment"-Android面试必问"精华技能点"汇总
- 皮划艇找瓶子--------阿里巴巴2015校招研发在线
- Summer day 1
- 提示框&对话框
- iostat命令使用指南
- 内核管理实战之虚地址转换为物理地址
- android app 默认的crash处理流程 (FATAL EXCEPTION)
- 自定义控件
- Bitmap