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.效果图,左右滑动显示通话记录和短信:





                    

相关文章推荐

Andriod开发技巧——Fragment的懒加载 和 禁止viewpager预加载

Andriod开发技巧——Fragment的懒加载 我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fr...

[android 创建Fragment示例传递参数时的注意事项]

最近做项目时,app打包时,报了一个这样的错误:Error:Error: This fragment should provide a default constructor (a public co...

Fragment和FragmentActivity的使用方法

认识:首先我们知道Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容。模块化这些UI面板以便提供给其他Acitivity使用便利。同时我们显示的Fragment也会受到当前...

Fragment 和 FragmentActivity的使用(不使用viewpager)

今天学习下 Android中的 Fragment 和 FragmentActivity,因为没有4.0手机,平台是2.3.3 所以我是使用 v4 support 包来进行学习。 要想用Fragm...

Fragment和FragmentActivity的使用方法 .

认识:首先我们知道Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容。模块化这些UI面板以便提供给其他Acitivity使用便利。同时我们显示的Fragment也会受到当前...
  • jdsjlzx
  • jdsjlzx
  • 2012年06月20日 00:23
  • 90409

Fragment 和 FragmentActivity的使用

今天学习下 Android中的 Fragment 和 FragmentActivity,因为没有4.0手机,平台是2.3.3 所以我是使用 v4 support 包来进行学习。 要想用Fragment...

android Fragment FragmentActivity 选项卡 replace add hide show

android Fragment FragmentActivity 选项卡 replace add hide show

Fragment 与FragmentActivity通信封装

在项目里面会经常用到Fragment与FragmentActivity,比如Fragment之间的界面切换与Fragment之间的值传递等等,为了方便起见我把Fragment和FragmentActi...

Fragment 和 FragmentActivity

认识:首先我们知道Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容。模块化这些UI面板以便提供给其他Acitivity使用便利。同时我们显示的Fragment也会受到当前...

Fragment 和 FragmentActivity的关系

前阵用viewpaper+fragment做滑动引导,查阅了下网上的资料,发现在有两种做法,一个是自建类直接继承Activity另一种是继承FragmentActivity,很是迷惑,在查了些goog...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Fragment 和 FragmentActivity的使用(二)
举报原因:
原因补充:

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