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

29 篇文章 0 订阅
29 篇文章 0 订阅


XSuperMES移动端要运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套app,然后拷贝一份,修改布局以适应什么超级大屏的。难道无法做到一个app可以同时适应手机和平板吗?答案是,当然有,那就是Fragment.Fragment出现的初衷就是为了解决这样的问题。

你可以把Fragment当成Activity一个界面的一部分,甚至Activity的界面由完全不同的Fragment组成,更帅气的是Fragment有自己的声明周期和接收、处理用户的事件,这样就不必要在一个Activity里面写一堆事件、控件的代码了。更为重要的是,你可以动态的添加、替换、移除某个Fragment。

1、如何使用fragment activity

   要想用Fragment 功能必须先让activity继承FragmentActivity,其原因是里面包含了Fragment运作的FragmentManager接口的实现类 FragmentManagerImpl ,由这个类管理所有Fragment的显示、隐藏

   1.使用最简单的Fragment,我们只要继承Fragment就可以

   public classTextFragment extends Fragment{ 

     

    privateString mMsg; 

     

    public voidsetMessage(String message){ 

       this.mMsg = message; 

    } 

     

   @Override 

    public ViewonCreateView(LayoutInflater inflater, ViewGroup container, 

           Bundle savedInstanceState) {  

        // TODOAuto-generated method stub 

        finalContext context = getActivity(); 

       FrameLayout root = new FrameLayout(context); 

       root.setBackgroundColor(Color.YELLOW); 

        TextViewtv = new TextView(context); 

        tv.setText(mMsg); 

       tv.setGravity(Gravity.CENTER); 

       root.addView(tv, new FrameLayout.LayoutParams( 

               ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT)); 

        returnroot; 

    } 

  }

  首先Fragment 就可以把它当作一个view , 只不过这个view activity一样有了生命周期函数

 

Fragment.onCreateView() 函数就是用于生成这个Fragment布局的view的,类似baseadapter.getView()

这样一个包含一个TextView的简单布局就完成了。

2.重写我们自己的FragmentActivity.

这里面主要要通过FragmentManager 来进行Fragment的添加和删除:

   public class TextFragment extendsFragment{ 

     

    private String mMsg; 

     

    public void setMessage(Stringmessage){ 

        this.mMsg = message; 

    } 

     

    @Override 

    public ViewonCreateView(LayoutInflater inflater, ViewGroup container, 

            BundlesavedInstanceState) { 

        // TODO Auto-generatedmethod stub 

        final Context context =getActivity(); 

        FrameLayout root = newFrameLayout(context); 

       root.setBackgroundColor(Color.YELLOW); 

        TextView tv = new TextView(context); 

        tv.setText(mMsg); 

       tv.setGravity(Gravity.CENTER); 

        root.addView(tv, newFrameLayout.LayoutParams( 

               ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT)); 

        return root; 

    } 

  }

  首先Fragment 就可以把它当作一个view , 只不过这个view activity一样有了生命周期函数  

 public class DoorFragmentActivityextends FragmentActivity{ 

 

    public static final StringFRAG_SMS = "sms_list_frag"; 

    public static final StringFRAG_TEXT = "text_frag"; 

     

    private FragmentmSMSFragment; 

    private FragmentmTextFragment; 

    private FragmentManagermFragMgr; 

     

    private Button mMenuBtn; 

     

    @Override 

    protected void onCreate(BundlesavedInstanceState) { 

        // TODO Auto-generated method stub 

       super.onCreate(savedInstanceState); 

       setContentView(R.layout.door_fragment_activity_layout); 

        mFragMgr =getSupportFragmentManager(); 

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

       mMenuBtn.setOnClickListener(new OnClickListener() { 

             

            @Override 

            public voidonClick(View v) { 

                // TODOAuto-generated method stub 

               showFragments(FRAG_TEXT, true);  

            } 

        }); 

       mMenuBtn.setOnLongClickListener(new OnLongClickListener() { 

             

            @Override 

            public booleanonLongClick(View v) { 

                // TODOAuto-generated method stub 

                  

                return false; 

            } 

        }); 

        initFragments(); 

        showFragments(FRAG_SMS,false); 

    } 

     

    private voidinitFragments(){ 

        mSMSFragment = newSMSListFragment(); 

        TextFragment textfrag =new TextFragment(); 

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

        mTextFragment =textfrag; 

         

    } 

     

    private voidshowFragments(String tag, boolean needback){ 

        FragmentTransaction trans= mFragMgr.beginTransaction(); 

        if(needback){ 

           trans.setCustomAnimations(R.anim.frag_enter,   

                   R.anim.frag_exit); 

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

           trans.addToBackStack(tag); 

        }else{ 

           trans.replace(R.id.door_contents_fl, getFragmentByTag(tag), tag); 

        } 

        trans.commit(); 

    } 

     

    private FragmentgetFragmentByTag(String tag){ 

       if(FRAG_SMS.equals(tag)){ 

            return mSMSFragment; 

        } 

       if(FRAG_TEXT.equals(tag)){ 

            returnmTextFragment; 

        } 

        return null; 

    } 

} 

  • 首先我们获取FragmentManager实现:直接调用 FragmentActivity.getSupportFragmentManager(),看源码可以知道这返回的是FragmentManager内部定义的实现类FragmentManagerImpl

  • 我们获取了FragmentManagerImpl后我们其实不咋操作这个类,只调用FragmentManager.beginTransation(),这个获取FragmentTransation接口的实现类(里面具体是BackStackRecord类的实例),我们关于Fragment的所有操作都是通过它来完成的,因为没仔细研究,我只了解直接自己在代码里面定义Fragment而没有在xml里面写(xml写觉得有点别扭)

    我们主要通过 FragmentTransation的一些方法来处理Fragment的:

1) trans.add(fragment, tag);  这个实际是 containerViewId = 0 调用的3)
2) trans.add(containerViewId, fragment);  
这个实际是 tag = null 调用的 3)
3) trans.add(containerViewId, fragment, tag);  
如果containerViewId != 0实际上调用的是获取到

   fragment onCreateView方法返回的view 并加入到containerViewId这个viewgroup中去即                viewgroup.addView(fragment.onCreateView());

未解决问题:containerViewId = 0 的时候代表什么??

4) trans.replace(containerViewId, fragment)  一样是null tag调用 5)
5) trans.replace(containerViewId, fragment, tag)  
这个一样是添加一个fragment到对应的container中去,只不过比add多了一步对相同containerViewId中已有的fragment检索,进行removeFragment操作,再去添加这个新来的fragment

6) trans.addToBackStack(tag); 如果你的fragment对于back键有类似activity的回退响应,就要记得把它加入到里面去,trans里面模拟了栈,但是我的回退没有响应我设置的exitanim 这个无语还没解决

3.再使用下ListFragment,我这里写的是SMSListFragment继承了ListFragment

public class SMSListFragment extends ListFragment{ 

     

    privateConversationListAdapter mAdapter; 

    private ConversationQuerymQuery; 

    private long startTime; 

     

    @Override 

    public void onCreate(BundlesavedInstanceState) { 

        // TODO Auto-generatedmethod stub 

       super.onCreate(savedInstanceState); 

        mAdapter = newConversationListAdapter(getActivity()); 

        mQuery = newConversationQuery(getActivity().getContentResolver()); 

    } 

     

    @Override 

    public voidonActivityCreated(Bundle savedInstanceState) { 

        // TODO Auto-generatedmethod stub 

       super.onActivityCreated(savedInstanceState); 

       setListAdapter(mAdapter); 

    } 

     

    @Override 

    public void onStart() { 

        // TODO Auto-generatedmethod stub 

        super.onStart(); 

        startAsyncQuery(); 

    } 

     

    @Override 

    public void onStop() { 

        // TODO Auto-generatedmethod stub 

        super.onStop(); 

       mAdapter.getCursor().close(); 

       mAdapter.changeCursor(null); 

    } 

     

    public void startAsyncQuery(){ 

        startTime =System.currentTimeMillis(); 

        mQuery.startQuery(1, null,Conversation.sAllThreadsUri, 

               Conversation.ALL_THREADS_PROJECTION, null, null, 

               Conversation.CONVERSATION_ORDER); 

    } 

     

    private final classConversationQuery extends AsyncQueryHandler { 

 

        public ConversationQuery(ContentResolvercr) { 

            super(cr); 

            // TODO Auto-generatedconstructor stub 

        } 

 

        @Override 

        protected voidonQueryComplete(int token, Object cookie, Cursor cursor) { 

            // TODO Auto-generatedmethod stub 

           System.out.println("conversation cursor size : " 

                    +cursor.getCount()); 

           mAdapter.changeCursor(cursor); 

            Toast.makeText(     getActivity(), 

                    "查询短信会话个数:" + cursor.getCount() + ",花费" 

                            +(System.currentTimeMillis() - startTime) + " ms", 

                   Toast.LENGTH_LONG).show(); 

        } 

     } 

  } 

代码中可以知道和使用普通的ListActivity完全没区别,

onCreate()中完成自己要一次性初始的东西,我在里面主要是初始化一个adapter和一个对sms数据库的查询

onActivityCreated()中将adapter设置给listview,这个不确定有没有更好的位置,

然后进入我们熟悉的生命周期方法:

onStart()中,开启查询

onStop()中,我们界面已经不在显示了,所以我们不关心数据库变化了,closecursor

  1. 主页面的布局文件:

<?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" > 

          <FrameLayout 

           android:id="@+id/door_contents_fl" 

           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> 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值