Android进阶之路 - Fragment(碎片化)、进栈、不进栈的简单使用(一)

来源:互联网 发布:淘宝网屏风富贵牡丹 编辑:程序博客网 时间:2024/06/05 18:22

这篇文章讲解的是Fragment在入门使用和开发使用的简单技术,对于初期学期人员可能认为Fragment的使用并不多见,这个其实是知识匮乏的误区,因为Fragment的使用场景比比皆是,文章不长,下面的请各位直接吸收咯。
单纯的来看,Fragment是寄生于Activity的活动,所以如果没有寄生体,Fragment自然不会存在。
从生命周期来看Fragment相比Activity之间多了 OnAttach/onDetach与onCreateView/onDestroy俩组生命周期,同时还有为了确保Activity已经创立完成的onActvityCreate生命周期

结构:
1.MainActivity、SecoundFreagment(不进栈)、CostomFragment(进栈)代码
2.对应的XML展示(俩个Fragment的Xml只看一个就好,没有什么技术含量)
3.使用中经常出现的小问题(可以小小注意一下,或许就会解决你的问题)

作为一名小小程序员,直接上代码(程序均可正常运行):

MainActivity:

package com.example.fragmentdemo;import android.os.Bundle;import android.support.v4.app.FragmentActivity;import android.view.View;import android.view.View.OnClickListener;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends FragmentActivity implements OnClickListener {    private TextView mButton1;    private TextView mButton2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 事件        initEvent();        //初始化布局        InitializeData();    }    /**     * 事件处理     * */    private void initEvent() {        mButton1 = (TextView) findViewById(R.id.main_button1);        mButton2 = (TextView) findViewById(R.id.main_button2);        mButton1.setOnClickListener(this);        mButton2.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.main_button1:            getSupportFragmentManager().beginTransaction().replace(                    R.id.main_fragment, new SencoundFragment()).commit();            Toast.makeText(MainActivity.this, "没有添加Onclick触发", 0).show();            break;        case R.id.main_button2:            getSupportFragmentManager().beginTransaction().replace(                    R.id.main_fragment, new SencoundFragment()).addToBackStack(null).commit();                    //这里需要注意的就是addToBackStack(null)这个方法了            Toast.makeText(MainActivity.this, "添加返回栈Onclick触发", 0).show();            break;        default:            break;        }    }    /**     * 初始化底部布局     * */    private void InitializeData() {        getSupportFragmentManager().beginTransaction().replace(                R.id.main_fragment, new CostomFragment()).commit();    }}

SecoundFragment:

package com.example.fragmentdemo;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * 替换的Fragment页面 * */public class SencoundFragment extends Fragment{    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {        View view=container.inflate(SencoundFragment.this.getActivity(), R.layout.fragment_sencound, null);//      View view = inflater.inflate(R.layout.fragment_sencound, null);俩者均可填充layout        return view;    }}

CostomFragment:

package com.example.fragmentdemo;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * 替换的Fragment页面 * */public class CostomFragment extends Fragment{    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {//      View view=container.inflate(CostomFragment.this.getActivity(), R.layout.fragment_costom, null);        View view = inflater.inflate(R.layout.fragment_costom, null);        return view;    }}

MainActivity的Xml:

<LinearLayout 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"    android:orientation="vertical"    tools:context=".MainActivity" >    <TextView        android:id="@+id/main_button1"        android:layout_width="match_parent"        android:layout_height="30dp"        android:layout_gravity="center"        android:gravity="center"        android:text="@string/one" />     <TextView        android:id="@+id/main_button2"        android:layout_width="match_parent"        android:layout_height="30dp"        android:layout_gravity="center"        android:gravity="center"        android:text="@string/two" />    <FrameLayout        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"         android:id="@+id/main_fragment"        /></LinearLayout>

SencoundFragment的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="vertical" >    <TextView         android:layout_width="match_parent"        android:layout_height="match_parent"        android:text="Secound页面的Fragment"        android:gravity="center"        /></LinearLayout>

CostomFragment的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="vertical" >    <TextView         android:layout_width="match_parent"        android:layout_height="match_parent"        android:text="Costom页面"        android:gravity="center"        /></LinearLayout>

问题注意点:
1.首先我们要有V4包,或者更高的兼容包
2.对应的Activity需要继承FragmentActivity
3.Fragment获取的管理者是SupportFragmentMessager不是FragmentMessager
4.进栈,不进栈的关键在于有没有addToBackStack(null),同时进栈会有一个模式,返回的时候往往会根据栈的当前结构进行返回,如果不进栈大多是要直接Back就退出程序了
5.如果自己写代码,千万要记得replace之后记得commit(提交)
6.子Fragemnt记得集成Fragment之后,需要导入的包是V4下的

0 0
原创粉丝点击