Fragment 和 FragmentActivity的使用(二)

今天继续完成剩下的学习部分,现在项目很多地方使用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.效果图,左右滑动显示通话记录和短信:




  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值