您的位置:首页 > 移动开发

XSuperMES移动端运用FragmentActivity适配大屏幕(二)

2015-11-30 09:04 316 查看


今天继续完成剩下的学习部分,现在项目很多地方使用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 extendsFragment{ 

 

 

private ListView vList; 

 

private CallPanelView vDial; 

 

private TextView vShowDial; 

 

private CallListAdapter mAdapter; 

 

 

 

private Animation mDialHidAnim; 

 

private Animation mDialShowAnim; 

 

 

@Override 

 

public View onCreateView(LayoutInflaterinflater, 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(BundlesavedInstanceState) { 

 

// 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 = newCallListAdapter(getActivity()); 

 

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

 

R.anim.dial_panel_hidden); 

 

mDialHidAnim.setAnimationListener(newAnimationListener() { 

 

public void onAnimationStart(Animationanimation) {} 

 

public void onAnimationRepeat(Animationanimation) {} 

 

public void onAnimationEnd(Animationanimation) { 

 

// End 

 

vShowDial.setVisibility(View.VISIBLE); 

 

vDial.setVisibility(View.GONE); 

 



 

}); 

 

 

 

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

 

R.anim.dial_panel_show); 

 

mDialShowAnim.setAnimationListener(newAnimationListener() { 

 

public void onAnimationStart(Animationanimation) {} 

 

public void onAnimationRepeat(Animationanimation) {} 

 

public void onAnimationEnd(Animationanimation) { 

 

// End 

 

vShowDial.setVisibility(View.GONE); 

 



 

}); 

 



 

  

private void bindView() { 

 

vList.setAdapter(mAdapter); 

 

vList.setOnItemClickListener(newOnItemClickListener() { 

 

 

 

@Override 

 

public voidonItemClick(AdapterView<?> parent, View view, 

 

int position, long id) { 

 

// TODO Auto-generated method stub 

 

CallItemView itemview = (CallItemView)view; 

 

itemview.toggleExpand(); 

 

hidDialPanel(true); 

 



 

}); 

 

 

 

vList.setOnScrollListener(newOnScrollListener() { 

 

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

 

@Override 

 

public voidonScrollStateChanged(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(newOnClickListener() { 

 

 

 

@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); 

 



 



 







布局修改成,增加ViewPager,去掉原有的容器framelayout:

<?xmlversion="1.0" encoding="utf-8"?> 



<FrameLayoutxmlns: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> 

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

Fragmentfragment = 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, "Addingitem #" + itemId + ": f=" + fragment); 

  

           mCurTransaction.add(container.getId(), fragment, 

  

                   makeFragmentName(container.getId(), itemId)); 

  

       


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

classFragmentAdapter extends FragmentPagerAdapter{ 

publicFragmentAdapter(FragmentManager fm) { 

 

super(fm); 

 

// TODOAuto-generated constructor stub 

 



     

@Override 

 

public FragmentgetItem(int position) { 

 

// TODOAuto-generated method stub 

 

returngetPagerFragmentByPosition(position); 

 



 

 

 

@Override 

 

public intgetCount() { 

 

// TODOAuto-generated method stub 

 

return 2; 

 



   

}privateFragment getPagerFragmentByPosition(int position){ 

 

if(position ==FRAG_INDEX_CALL_LOG){ 

 

return newCallLogsFragment(); 

 



 

if(position == FRAG_INDEX_SMS){ 

 

return newSMSListFragment(); 

 



 

returnnull; 

 



页面完整代码:

public classDoorFragmentActivity extends FragmentActivity{ 

    

public staticfinal String FRAG_SMS = "sms_list_frag"; 

 

public staticfinal String FRAG_TEXT = "text_frag"; 

   

public staticfinal int FRAG_INDEX_CALL_LOG = 0; 

 

public staticfinal int FRAG_INDEX_SMS = 1; 

  

private FragmentmTextFragment; 

 

privateFragmentManager mFragMgr; 

 

 

privateViewPager vViewPager; 

 

private ButtonmMenuBtn; 

   

@Override 

 

protected voidonCreate(Bundle savedInstanceState) { 

 

// TODOAuto-generated method stub 

 

super.onCreate(savedInstanceState); 

 

setContentView(R.layout.door_fragment_activity_layout); 

 

initFragments(); 

 

bindViews(); 

 



 

private voidbindViews(){ 

 

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

 

mMenuBtn.setOnClickListener(newOnClickListener() { 

 

 

@Override 

 

public voidonClick(View v) { 

 

// TODOAuto-generated method stub 

 

showOutFragments(FRAG_TEXT,true); 

 



 

}); 

 

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

 

vViewPager.setAdapter(newFragmentAdapter(mFragMgr)); 

 



 

 

private voidinitFragments(){ 

 

mFragMgr = getSupportFragmentManager(); 

 

TextFragmenttextfrag = new TextFragment(); 

 

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

 

mTextFragment =textfrag; 

 



 

 

private voidshowOutFragments(String tag, boolean needback){ 

 

FragmentTransactiontrans = 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 FragmentgetFragmentByTag(String tag){ 

 

if(FRAG_TEXT.equals(tag)){ 

 

returnmTextFragment; 

 



 

returnnull; 

 



 

 

private FragmentgetPagerFragmentByPosition(int position){ 

 

if(position ==FRAG_INDEX_CALL_LOG){ 

 

return newCallLogsFragment(); 

 



 

if(position ==FRAG_INDEX_SMS){ 

 

return newSMSListFragment(); 

 



 

returnnull; 

 



 

 

classFragmentAdapter extends FragmentPagerAdapter{ 

 

 

 

publicFragmentAdapter(FragmentManager fm) { 

 

super(fm); 

 

// TODOAuto-generated constructor stub 

 



 

 

 

@Override 

 

public FragmentgetItem(int position) { 

 

// TODOAuto-generated method stub 

 

returngetPagerFragmentByPosition(position); 

 



 

 

 

@Override 

 

public intgetCount() { 

 

// TODOAuto-generated method stub 

 

return 2; 

 

}   





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: