activity, fragment

 Fragment 和 FragmentActivity的使用

Fragment 和 FragmentActivity的使用(二)

activity, fragmentactivity, fragment

public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {

public void onAttach(Activity activity) {

public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {

public void onCreate(Bundle savedInstanceState) {

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,

        @Nullable Bundle savedInstanceState) {

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

}

public void onActivityCreated(@Nullable Bundle savedInstanceState) {

    

public void onViewStateRestored(@Nullable Bundle savedInstanceState) {

    

public void onStart() {

public void onResume() {

public void onPause() {

public void onStop() {

public void onLowMemory() {

public void onDestroyView() {

public void onDestroy() {

public void onDetach() {

 // 加入fragment 

public class MainActivity extends Activity implements OnClickListener

{

    private LinearLayout mTabWeixin;

    private LinearLayout mTabFriend;

 

    private ContentFragment mWeixin;

    private FriendFragment mFriend;

 

    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_main);

 

        // 初始化控件和声明事件

        mTabWeixin = (LinearLayout) findViewById(R.id.tab_bottom_weixin);

        mTabFriend = (LinearLayout) findViewById(R.id.tab_bottom_friend);

        mTabWeixin.setOnClickListener(this);

        mTabFriend.setOnClickListener(this);

 

        // 设置默认的Fragment

        setDefaultFragment();

    }

 

    private void setDefaultFragment()

    {

        FragmentManager fm = getFragmentManager();

        FragmentTransaction transaction = fm.beginTransaction();

        mWeixin = new ContentFragment();

        transaction.replace(R.id.id_content, mWeixin);

        transaction.commit();

    }

 

    @Override

    public void onClick(View v)

    {

        FragmentManager fm = getFragmentManager();

        // 开启Fragment事务

        FragmentTransaction transaction = fm.beginTransaction();

 

        switch (v.getId())

        {

        case R.id.tab_bottom_weixin:

            if (mWeixin == null)

            {

                mWeixin = new ContentFragment();

            }

            // 使用当前Fragment的布局替代id_content的控件

            transaction.replace(R.id.id_content, mWeixin);

            break;

        case R.id.tab_bottom_friend:

            if (mFriend == null)

            {

                mFriend = new FriendFragment();

            }

            transaction.replace(R.id.id_content, mFriend);

            break;

        }

        // transaction.addToBackStack();

        // 事务提交

        transaction.commit();

    }

 

}

 动态加载 

public class FriendFragment extends Fragment

{

 

    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container,

            Bundle savedInstanceState)

    {

        return inflater.inflate(R.layout.fragment_friend, container, false);

    }

 

}

  

API
Fragment常用的三个类:

android.app.Fragment 主要用于定义Fragment

android.app.FragmentManager 主要用于在Activity中操作Fragment

android.app.FragmentTransaction 保证一些列Fragment操作的原子性

a、获取FragmentManage的方式:

当遇到这种嵌套多层的Fragment的时候:第一层的FragmentManager,可以通过getSupportFragmentManager()或者getFragmentManager()获得,第二层的fragment中必须用getChildFragmentManager()。

b、主要的操作都是FragmentTransaction的方法

FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

transaction.add()

往Activity中添加一个Fragment

transaction.remove()

从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

transaction.replace()

使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~

transaction.hide()

隐藏当前的Fragment,仅仅是设为不可见,并不会销毁

transaction.show()

显示之前隐藏的Fragment

detach()

将此Fragment从Activity中分离,会销毁其布局,但不会销毁该实例(detach()->onPause()->onStop()->onDestroyView())

attach()

将从Activity中分离的Fragment,重新关联到该Activity,重新创建其视图层次(attach()->onCreateView()->onActivityCreated()->onStart()->onResume())

transatcion.commit()//提交一个事务

 

管理Fragment回退栈:加入回退栈的是事务

FragmentTransaction.addToBackStack(String)
<RelativeLayout 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" >  

  

    <FrameLayout  

        android:id="@+id/id_content"  

        android:layout_width="fill_parent"  

        android:layout_height="fill_parent" >  

    </FrameLayout>  

  

</RelativeLayout>

  

replace 与 addToBackStack(null); 连用,则该实例不会销毁(但视图层会销毁)
 FragmentTwo fTwo = new FragmentTwo();  

 FragmentManager fm = getFragmentManager();  

 FragmentTransaction tx = fm.beginTransaction();  

 tx.replace(R.id.id_content, fTwo, "TWO");  

 tx.addToBackStack(null);  

 tx.commit();  

避免视图重绘

FragmentThree fThree = new FragmentThree();  

FragmentManager fm = getFragmentManager();  

FragmentTransaction tx = fm.beginTransaction();  

tx.hide(this);  

tx.add(R.id.id_content , fThree, "THREE");  

tx.addToBackStack(null);  

tx.commit();  

 

fragment与activity的通信:

getFragmentManager.findFragmentByTag()或者findFragmentById()

getActivity()

package com.zhy.zhy_fragments;  

  

import android.app.Fragment;  

import android.os.Bundle;  

import android.view.LayoutInflater;  

import android.view.View;  

import android.view.View.OnClickListener;  

import android.view.ViewGroup;  

import android.widget.Button;  

  

public class FragmentOne extends Fragment implements OnClickListener  

{  

    private Button mBtn;  

  

    /** 

     * 设置按钮点击的回调 

     * @author zhy 

     * 

     */  

    public interface FOneBtnClickListener  

    {  

        void onFOneBtnClick();  

    }  

  

    @Override  

    public View onCreateView(LayoutInflater inflater, ViewGroup container,  

            Bundle savedInstanceState)  

    {  

        View view = inflater.inflate(R.layout.fragment_one, container, false);  

        mBtn = (Button) view.findViewById(R.id.id_fragment_one_btn);  

        mBtn.setOnClickListener(this);  

        return view;  

    }  

  

    /** 

     * 交给宿主Activity处理,如果它希望处理 

     */  

    @Override  

    public void onClick(View v)  

    {  

        if (getActivity() instanceof FOneBtnClickListener)  

        {  

            ((FOneBtnClickListener) getActivity()).onFOneBtnClick();  

        }  

    }  

  

}  

package com.zhy.zhy_fragments;  

  

import android.app.Fragment;  

import android.os.Bundle;  

import android.view.LayoutInflater;  

import android.view.View;  

import android.view.View.OnClickListener;  

import android.view.ViewGroup;  

import android.widget.Button;  

  

public class FragmentTwo extends Fragment implements OnClickListener  

{  

  

      

    private Button mBtn ;  

      

    private FTwoBtnClickListener fTwoBtnClickListener ;  

      

    public interface FTwoBtnClickListener  

    {  

        void onFTwoBtnClick();  

    }  

    //设置回调接口  

    public void setfTwoBtnClickListener(FTwoBtnClickListener fTwoBtnClickListener)  

    {  

        this.fTwoBtnClickListener = fTwoBtnClickListener;  

    }  

    @Override  

    public View onCreateView(LayoutInflater inflater, ViewGroup container,  

            Bundle savedInstanceState)  

    {  

        View view = inflater.inflate(R.layout.fragment_two, container, false);  

        mBtn = (Button) view.findViewById(R.id.id_fragment_two_btn);  

        mBtn.setOnClickListener(this);  

        return view ;   

    }  

    @Override  

    public void onClick(View v)  

    {  

        if(fTwoBtnClickListener != null)  

        {  

            fTwoBtnClickListener.onFTwoBtnClick();  

        }  

    }  

  

}  

package com.zhy.zhy_fragments;  

  

import android.app.Activity;  

import android.app.FragmentManager;  

import android.app.FragmentTransaction;  

import android.os.Bundle;  

import android.view.Window;  

  

import com.zhy.zhy_fragments.FragmentOne.FOneBtnClickListener;  

import com.zhy.zhy_fragments.FragmentTwo.FTwoBtnClickListener;  

  

public class MainActivity extends Activity implements FOneBtnClickListener,  

        FTwoBtnClickListener  

{  

  

    private FragmentOne mFOne;  

    private FragmentTwo mFTwo;  

    private FragmentThree mFThree;  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState)  

    {  

        super.onCreate(savedInstanceState);  

        requestWindowFeature(Window.FEATURE_NO_TITLE);  

        setContentView(R.layout.activity_main);  

  

        mFOne = new FragmentOne();  

        FragmentManager fm = getFragmentManager();  

        FragmentTransaction tx = fm.beginTransaction();  

        tx.add(R.id.id_content, mFOne, "ONE");  

        tx.commit();  

    }  

  

    /** 

     * FragmentOne 按钮点击时的回调 

     */  

    @Override  

    public void onFOneBtnClick()  

    {  

  

        if (mFTwo == null)  

        {  

            mFTwo = new FragmentTwo();  

            mFTwo.setfTwoBtnClickListener(this);  

        }  

        FragmentManager fm = getFragmentManager();  

        FragmentTransaction tx = fm.beginTransaction();  

        tx.replace(R.id.id_content, mFTwo, "TWO");  

        tx.addToBackStack(null);  

        tx.commit();  

    }  

  

    /** 

     * FragmentTwo 按钮点击时的回调 

     */  

    @Override  

    public void onFTwoBtnClick()  

    {  

        if (mFThree == null)  

        {  

            mFThree = new FragmentThree();  

  

        }  

        FragmentManager fm = getFragmentManager();  

        FragmentTransaction tx = fm.beginTransaction();  

        tx.hide(mFTwo);  

        tx.add(R.id.id_content, mFThree, "THREE");  

        // tx.replace(R.id.id_content, fThree, "THREE");  

        tx.addToBackStack(null);  

        tx.commit();  

    }  

  

}  

 

避免屏幕旋转或切入后台引起的页面重绘时重复添加fragment,用onSaveInstanceState同步保存数据。

      if(savedInstanceState == null)  

        {  

            mFOne = new FragmentOne();  

            FragmentManager fm = getFragmentManager();  

            FragmentTransaction tx = fm.beginTransaction();  

            tx.add(R.id.id_content, mFOne, "ONE");  

            tx.commit();  

        }   

 

Fragmeny与ActionBar和MenuItem集成

Fragment可以添加自己的MenuItem到Activity的ActionBar或者可选菜单中。

a、在Fragment的onCreate中调用 setHasOptionsMenu(true);

b、然后在Fragment子类中实现onCreateOptionsMenu

c、如果希望在Fragment中处理MenuItem的点击,也可以实现onOptionsItemSelected;当然了Activity也可以直接处理该MenuItem的点击事件。

package com.zhy.zhy_fragments;  

  

import android.app.Fragment;  

import android.os.Bundle;  

import android.view.LayoutInflater;  

import android.view.Menu;  

import android.view.MenuInflater;  

import android.view.MenuItem;  

import android.view.View;  

import android.view.ViewGroup;  

import android.widget.Toast;  

  

public class FragmentOne extends Fragment  

{  

  

    @Override  

    public void onCreate(Bundle savedInstanceState)  

    {  

        super.onCreate(savedInstanceState);  

        setHasOptionsMenu(true);  

    }  

  

    @Override  

    public View onCreateView(LayoutInflater inflater, ViewGroup container,  

            Bundle savedInstanceState)  

    {  

        View view = inflater.inflate(R.layout.fragment_one, container, false);  

        return view;  

    }  

  

    @Override  

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)  

    {  

        inflater.inflate(R.menu.fragment_menu, menu);  

    }  

  

    @Override  

    public boolean onOptionsItemSelected(MenuItem item)  

    {  

        switch (item.getItemId())  

        {  

        case R.id.id_menu_fra_test:  

            Toast.makeText(getActivity(), "FragmentMenuItem1", Toast.LENGTH_SHORT).show();  

            break;  

        }  

        return true;  

    }  

  

}  

package com.zhy.zhy_fragments;  

  

import android.app.Activity;  

import android.app.FragmentManager;  

import android.app.FragmentTransaction;  

import android.os.Bundle;  

import android.util.Log;  

import android.view.Menu;  

import android.view.MenuItem;  

import android.view.Window;  

import android.widget.Toast;  

  

public class MainActivity extends Activity  

  

{  

    private static final String TAG = "FragmentOne";  

    private FragmentOne mFOne;  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState)  

    {  

        super.onCreate(savedInstanceState);  

        requestWindowFeature(Window.FEATURE_NO_TITLE);  

        setContentView(R.layout.activity_main);  

  

        Log.e(TAG, savedInstanceState + "");  

  

        if (savedInstanceState == null)  

        {  

            mFOne = new FragmentOne();  

            FragmentManager fm = getFragmentManager();  

            FragmentTransaction tx = fm.beginTransaction();  

            tx.add(R.id.id_content, mFOne, "ONE");  

            tx.commit();  

        }  

  

    }  

  

    @Override  

    public boolean onCreateOptionsMenu(Menu menu)  

    {  

        super.onCreateOptionsMenu(menu);  

        getMenuInflater().inflate(R.menu.main, menu);  

        return true;  

    }  

  

    @Override  

    public boolean onOptionsItemSelected(MenuItem item)  

    {  

        switch (item.getItemId())  

        {  

        case R.id.action_settings:  

            Toast.makeText(this, "setting", Toast.LENGTH_SHORT).show();  

            return true;  

        default:  

            //如果希望Fragment自己处理MenuItem点击事件,一定不要忘了调用super.xxx  

            return super.onOptionsItemSelected(item);  

        }  

    }  

  

}  

  

  

  

  

  

  

 

  

  



你可能感兴趣的:(Activity)