Fragment 和 FragmentActivity的使用(二)

原创 2013年12月03日 15:34:12

今天继续完成剩下的学习部分,现在项目很多地方使用viewpager来提供滑动,今天记录学习viewpager配合fragment的显示,增加一个CallLogsFragment配合之前SMSListFragment
1.CallLogsFragment,主要显示手机的电话记录,这都是之前的代码,所以只要把Activity转换成Fragment就可以了,也一样, 
Activity.setContentView(int) 转变成Fragment.onCreateView(View) 并且 findViewById也在里面了
Activity.onCreate() 代码 转成  Fragment.onActivityCreated()中
Activity.onResume() 代码 转成 Fragment.onResume() 中

 代码如下:

public class CallLogsFragment extends Fragment{


private ListView vList;

private CallPanelView vDial;

private TextView vShowDial;

private CallListAdapter mAdapter;



private Animation mDialHidAnim;

private Animation mDialShowAnim;


@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

// TODO Auto-generated method stub

View root = inflater.inflate(R.layout.activity_calls_list_screen, null);

vList = (ListView) root.findViewById(R.id.activity_call_list_lv);

vShowDial = (TextView) root.findViewById(R.id.activity_call_show_dial);

vDial = (CallPanelView) root.findViewById(R.id.dial_panel_view);

return root;

}


@Override

public void onActivityCreated(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onActivityCreated(savedInstanceState);

prepareResourceAndData();

bindView();

}


@Override

public void onResume() {

// TODO Auto-generated method stub

super.onResume();

mAdapter.setCallNumbers(CallCache.getInstance().getCallNumbers());

}


private void prepareResourceAndData() {

mAdapter = new CallListAdapter(getActivity());

mDialHidAnim = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),

R.anim.dial_panel_hidden);

mDialHidAnim.setAnimationListener(new AnimationListener() {

public void onAnimationStart(Animation animation) {}

public void onAnimationRepeat(Animation animation) {}

public void onAnimationEnd(Animation animation) {

// End

vShowDial.setVisibility(View.VISIBLE);

vDial.setVisibility(View.GONE);

}

});



mDialShowAnim = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),

R.anim.dial_panel_show);

mDialShowAnim.setAnimationListener(new AnimationListener() {

public void onAnimationStart(Animation animation) {}

public void onAnimationRepeat(Animation animation) {}

public void onAnimationEnd(Animation animation) {

// End

vShowDial.setVisibility(View.GONE);

}

});

}


private void bindView() {

vList.setAdapter(mAdapter);

vList.setOnItemClickListener(new OnItemClickListener() {



@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

// TODO Auto-generated method stub

CallItemView itemview = (CallItemView) view;

itemview.toggleExpand();

hidDialPanel(true);

}

});



vList.setOnScrollListener(new OnScrollListener() {

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

// TODO Auto-generated method stub

if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {

hidDialPanel(false);

}

}

});



vDial.setPanelAnim(mDialShowAnim, mDialHidAnim);




vShowDial.setVisibility(View.GONE);

vShowDial.setOnClickListener(new OnClickListener() {



@Override

public void onClick(View v) {

// TODO Auto-generated method stub

vDial.show();

}

});

}



private void hidDialPanel(boolean anim) {

if (vDial.getVisibility() == View.VISIBLE) {

if(anim){

vDial.dismiss();

}else{

vDial.setVisibility(View.GONE);

vShowDial.setVisibility(View.VISIBLE);

}

}

}
}
}


2.对昨天主页面布局修改,增加ViewPager,去掉原有的容器framelayout:

<?xml version="1.0" encoding="utf-8"?>
<
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
    android:id="@+id/door_root_content_fl"
 
    android:layout_width="match_parent"
 
    android:layout_height="match_parent" >



    <LinearLayout
 
        android:layout_width="match_parent"
 
        android:layout_height="match_parent"
 
        android:orientation="vertical" >



        <android.support.v4.view.ViewPager
 
            android:id="@+id/door_viewpager_content_vp"
 
            android:layout_width="match_parent"
 
            android:layout_height="0dp"
 
            android:layout_weight="1" />



        <LinearLayout
 
            android:layout_width="match_parent"
 
            android:layout_height="55dp"
 
            android:orientation="horizontal" >



            <Button
 
                android:id="@+id/door_menu_btn"
 
                android:layout_width="match_parent"
 
                android:layout_height="match_parent"
 
                android:gravity="center"
 
                android:text="菜单" />
 
        </LinearLayout>
 
    </LinearLayout>



<
</FrameLayout>

3.V4 support 包里面已经帮我们写好了 FragmentPagerAdapter,看源码可以知道在 PageAdapter.instantiateItem中,有:

Fragment fragment = mFragmentManager.findFragmentByTag(name);
 
        if (fragment != null) {
 
            if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
 
            mCurTransaction.attach(fragment);
 
        } else {
 
            fragment = getItem(position);
 
            if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
 
            mCurTransaction.add(container.getId(), fragment,
 
                    makeFragmentName(container.getId(), itemId));
 
        }

可以看出 ViewPager在添加fragment 的时候先在FragmentManager里面找有没有,如果没有就会去请求PageAdapter.getItem(position)来生成fragment,进行添加,因此我们只要重写FragmentPagerAdapter并实现getItem方法就可以了,代码如下:

class FragmentAdapter extends FragmentPagerAdapter{



public FragmentAdapter(FragmentManager fm) {

super(fm);

// TODO Auto-generated constructor stub

}



@Override

public Fragment getItem(int position) {

// TODO Auto-generated method stub

return getPagerFragmentByPosition(position);

}



@Override

public int getCount() {

// TODO Auto-generated method stub

return 2;

}


}private Fragment getPagerFragmentByPosition(int position){

if(position == FRAG_INDEX_CALL_LOG){

return new CallLogsFragment();

}

if(position == FRAG_INDEX_SMS){

return new SMSListFragment();

}

return null;

}

4.页面完整代码:

public class DoorFragmentActivity extends FragmentActivity{



public static final String FRAG_SMS = "sms_list_frag";

public static final String FRAG_TEXT = "text_frag";


public static final int FRAG_INDEX_CALL_LOG = 0;

public static final int FRAG_INDEX_SMS = 1;


private Fragment mTextFragment;

private FragmentManager mFragMgr;


private ViewPager vViewPager;


private Button mMenuBtn;


@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.door_fragment_activity_layout);

initFragments();

bindViews();

}


private void bindViews(){

mMenuBtn = (Button) findViewById(R.id.door_menu_btn);

mMenuBtn.setOnClickListener(new OnClickListener() {


@Override

public void onClick(View v) {

// TODO Auto-generated method stub

showOutFragments(FRAG_TEXT, true);

}

});

vViewPager = (ViewPager) findViewById(R.id.door_viewpager_content_vp);

vViewPager.setAdapter(new FragmentAdapter(mFragMgr));

}


private void initFragments(){

mFragMgr = getSupportFragmentManager();

TextFragment textfrag = new TextFragment();

textfrag.setMessage("这是 菜单界面");

mTextFragment = textfrag;

}


private void showOutFragments(String tag, boolean needback){

FragmentTransaction trans = mFragMgr.beginTransaction();

trans.setCustomAnimations(R.anim.frag_enter,  

R.anim.frag_exit);

trans.add(R.id.door_root_content_fl, getFragmentByTag(tag), tag);

if(needback){

trans.addToBackStack(tag);

}

trans.commit();

}


private Fragment getFragmentByTag(String tag){

if(FRAG_TEXT.equals(tag)){

return mTextFragment;

}

return null;

}


private Fragment getPagerFragmentByPosition(int position){

if(position == FRAG_INDEX_CALL_LOG){

return new CallLogsFragment();

}

if(position == FRAG_INDEX_SMS){

return new SMSListFragment();

}

return null;

}


class FragmentAdapter extends FragmentPagerAdapter{



public FragmentAdapter(FragmentManager fm) {

super(fm);

// TODO Auto-generated constructor stub

}



@Override

public Fragment getItem(int position) {

// TODO Auto-generated method stub

return getPagerFragmentByPosition(position);

}



@Override

public int getCount() {

// TODO Auto-generated method stub

return 2;

}


}
}
}

5.效果图,左右滑动显示通话记录和短信:





                

Fragment 和 FragmentActivity的使用

今天学习下 Android中的 Fragment 和 FragmentActivity,因为没有4.0手机,平台是2.3.3 所以我是使用 v4 support 包来进行学习。 要想用Fragment...
  • izy0001989624
  • izy0001989624
  • 2013年12月02日 15:36
  • 110668

Fragment的Tag

android.app.FragmentManager.findFragmentByTag(String tag) shi
  • u011309801
  • u011309801
  • 2014年10月09日 16:59
  • 6520

Andriod Fragment---给Activity添加一个Fragment

通常,Fragment作为Activity整体视图层次树的一部分,被嵌入到宿主Activity的界面的一部分。有两种方法能够把Fragment添加到Activity布局中: 1.  在Activit...
  • FireOfStar
  • FireOfStar
  • 2012年02月19日 18:52
  • 49335

Fragment 和 FragmentActivity的使用(二)

今天继续完成剩下的学习部分,现在项目很多地方使用viewpager来提供滑动,今天记录学习viewpager配合fragment的显示,增加一个CallLogsFragment配合之前SMSListF...
  • izy0001989624
  • izy0001989624
  • 2013年12月03日 15:34
  • 16057

Activity Fragments

Android API Guides定义:A Fragment represents a behavior or a portion of user interface in an Activity....
  • caryee89
  • caryee89
  • 2015年03月06日 15:38
  • 431

Android区别——FragmentActivity和Activity的具体区别

转自http://www.cnblogs.com/wanqieddy/p/3818718.html ragment是3.0以后的东西,为了在低版本中使用fragment就要用到android-s...
  • chuntiandejiaobu10
  • chuntiandejiaobu10
  • 2016年08月10日 15:57
  • 679

Fragment、FragmentActivity 和Actvity区别

1.fragment是Android4.0以上才有的;fragment是为了适应Android碎片化所采用的技术(开发的应用在平板上显示的不是太丑) 2.FragmentActivity是为了兼容4...
  • zinjin_woxin
  • zinjin_woxin
  • 2016年07月14日 10:32
  • 2158

Fragment详解之三——管理Fragment(1)

前言:follow your heart,be your own king
  • harvic880925
  • harvic880925
  • 2015年04月07日 23:00
  • 77420

Fragment使用findFragmentById返回null

今天换新版本的ADT之后默认建立工程引入Fragment,之前对Fragment没有做过了解。 想学习一下,在Activity的onCreate方法中无论怎么获取Fragment都是null,代码如...
  • huiguixian
  • huiguixian
  • 2014年09月29日 21:53
  • 26298

关于Toolbar和FragmentActivity的问题

今天在工作中遇到用Fragment搭Tab框架时,FragmentActivity无法使用Toolbar的问题。查了许多资料,其实AppComponent继承自FragmentActivity,所以A...
  • qq_23589445
  • qq_23589445
  • 2015年10月22日 23:16
  • 2043
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Fragment 和 FragmentActivity的使用(二)
举报原因:
原因补充:

(最多只允许输入30个字)