自己对于Fragment的一些总结

Fragment和Activity的生命周期方法类似,只是Fragment比Activity多了几个方法而已,如:


// onAttach方法:Fragment和Activity建立关联的时候调用*/

1.onAttach(Activity activity)


//onCreateView方法:为Fragment加载布局时调用

2.onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState

// Fragment中的布局被移除时调用

3.onDestroyView()


Fragment是sdk 3.0出现的,主要原因是适应大屏,如平板。


//下面的demo主要讲了如何实现Fragment和Fragment之间的通信,Fragment之间并不能直接通信,Activity是

是Fragment之间通信的桥梁。下面是一个简单的例子。

本Demo为适应小屏和大屏(平板),有连个主要布局,通过代码可看出。

news_articles.xml ( 用于大屏(平板))

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment android:name="com.example.android.fragments.HeadlinesFragment"
              android:id="@+id/headlines_fragment"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

    <fragment android:name="com.example.android.fragments.ArticleFragment"
              android:id="@+id/article_fragment"
              android:layout_weight="2"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

</LinearLayout>
news_articles.xml ( 用于小屏)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

//列表 HeadlinesFragment .java

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;


    public interface OnHeadlineSelectedListener {
        
        public void onArticleSelected(int position);
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
         Log.i("HONEYCOMB-------------->", Build.VERSION_CODES.HONEYCOMB+"");//3.0
         Log.i("SDK_INT---------------->", Build.VERSION.SDK_INT+"");//4.2.2
         
         //判断当前的sdk版本,如果本设备版本大于3.0则用新的API
         int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
                android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;


        setListAdapter(new ArrayAdapter<String>(getActivity(), layout, Ipsum.Headlines));
    }


    @Override
    public void onStart() {
        super.onStart();
        
        //大屏
        if (getFragmentManager().findFragmentById(R.id.article_fragment) != null) {
        	
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);//选择模式(单选,还有多选模式)
        }
    }


    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);


        try {
        	
              mCallback = (OnHeadlineSelectedListener) activity;
              
        } catch (ClassCastException e) {
        	
            throw new ClassCastException(activity.toString() 
            		+ "必须要实现OnHeadlineSelectedListener");
                   
        }
    }


    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
    	//调用此方法实现接口回调
        mCallback.onArticleSelected(position);
        getListView().setItemChecked(position, true);
    }
}

MainActivity.java

public class MainActivity extends FragmentActivity 
       implements HeadlinesFragment.OnHeadlineSelectedListener {
       
    /**
     *savedInstanceState保存Activity的状态信息 */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);
        
       /**
        *  此条件成立则设备是小屏设备*/
        if (findViewById(R.id.fragment_container) != null) {

            if (savedInstanceState != null) {
                return;
            }
            //实例化Fragment
            HeadlinesFragment firstFragment = new HeadlinesFragment();
            Bundle bundle=getIntent().getExtras();
            firstFragment.setArguments(bundle);
            //开启事务,然后提交
            getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();
                    
        }
    }

    public void onArticleSelected(int position) {

        ArticleFragment articleFrag = (ArticleFragment)getSupportFragmentManager().findFragmentById(R.id.article_fragment);
         //加载的是大屏布局文件
        if (articleFrag != null) {
        	
               articleFrag.updateArticleView(position);
               
        } else {
        	    //加载的是小屏布局文件
	            ArticleFragment newFragment = new ArticleFragment();
	            Bundle args = new Bundle();
	            //通过Bundle携带所点击列表项的id值发送给ArticleFragment
	            args.putInt(ArticleFragment.ARG_POSITION, position);
	            newFragment.setArguments(args);
	            //事务
	            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
	            transaction.replace(R.id.fragment_container, newFragment);
	            transaction.addToBackStack(null);
	            transaction.commit();//提交
	            
        }
        
    }
    
}

ArticleFragment.java
public class ArticleFragment extends Fragment {
    final static String ARG_POSITION = "position";
    int mCurrentPosition = -1;

    //加载布局的时候调用
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {

        
        if (savedInstanceState != null) {
            mCurrentPosition = savedInstanceState.getInt(ARG_POSITION);
        }
          return inflater.inflate(R.layout.article_view, container, false);
    }

    @Override
    public void onStart() {
        super.onStart();
        
        Bundle args = getArguments();//在该步接受HeadlinesFragment传递过来的Bundle
        if (args != null) {
        	int i=args.getInt(ARG_POSITION);
            updateArticleView(i);
        } else if (mCurrentPosition != -1) {//此处是针对应用崩溃时onCreateView得到的保存的状态值调用
            updateArticleView(mCurrentPosition);
        }
        
    }

    //显示对应的文章
    public void updateArticleView(int position) {
        TextView article = (TextView) getActivity().findViewById(R.id.article);
        article.setText(Ipsum.Articles[position]);
        mCurrentPosition = position;
    }

    //系统强制退出的时候调用(例如系统崩溃,应用崩溃),非人工退出
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt(ARG_POSITION, mCurrentPosition);//保存状态
    }
}

猛击下载资源









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值