XSuperMES移動端運用FragmentActivity適配大螢幕(一)

來源:互聯網
上載者:User

標籤:

XSuperMES移動端運用FragmentActivity適配大螢幕

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 class TextFragment extends Fragment{ 

     

    private String mMsg; 

     

    public void setMessage(String message){ 

        this.mMsg = message; 

    } 

     

    @Override 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 

            Bundle savedInstanceState) {  

        // TODO Auto-generated method stub 

        final Context context = getActivity(); 

        FrameLayout root = new FrameLayout(context); 

        root.setBackgroundColor(Color.YELLOW); 

        TextView tv = new TextView(context); 

        tv.setText(mMsg); 

        tv.setGravity(Gravity.CENTER); 

        root.addView(tv, new FrameLayout.LayoutParams( 

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

        return root; 

    } 

  }

  首先Fragment 就可以把它當作一個view , 只不過這個view 與 activity一樣有了生命週期函數

                       

 

Fragment.onCreateView() 函數就是用於產生這個Fragment布局的view的,類似baseadapter.getView()

這樣一個包含一個TextView的簡單布局就完成了。

2.重寫我們自己的FragmentActivity.

這裡面主要要通過FragmentManager 來進行Fragment的添加和刪除:

   public class TextFragment extends Fragment{ 

     

    private String mMsg; 

     

    public void setMessage(String message){ 

        this.mMsg = message; 

    } 

     

    @Override 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 

            Bundle savedInstanceState) { 

        // TODO Auto-generated method stub 

        final Context context = getActivity(); 

        FrameLayout root = new FrameLayout(context); 

        root.setBackgroundColor(Color.YELLOW); 

        TextView tv = new TextView(context); 

        tv.setText(mMsg); 

        tv.setGravity(Gravity.CENTER); 

        root.addView(tv, new FrameLayout.LayoutParams( 

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

        return root; 

    } 

  }

  首先Fragment 就可以把它當作一個view , 只不過這個view 與 activity一樣有了生命週期函數  

 public class DoorFragmentActivity extends FragmentActivity{ 

 

    public static final String FRAG_SMS = "sms_list_frag"; 

    public static final String FRAG_TEXT = "text_frag"; 

     

    private Fragment mSMSFragment; 

    private Fragment mTextFragment; 

    private FragmentManager mFragMgr; 

     

    private Button mMenuBtn; 

     

    @Override 

    protected void onCreate(Bundle savedInstanceState) { 

        // 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 void onClick(View v) { 

                // TODO Auto-generated method stub 

                showFragments(FRAG_TEXT, true);  

            } 

        }); 

        mMenuBtn.setOnLongClickListener(new OnLongClickListener() { 

             

            @Override 

            public boolean onLongClick(View v) { 

                // TODO Auto-generated method stub 

                  

                return false; 

            } 

        }); 

        initFragments(); 

        showFragments(FRAG_SMS, false); 

    } 

     

    private void initFragments(){ 

        mSMSFragment = new SMSListFragment(); 

        TextFragment textfrag = new TextFragment(); 

        textfrag.setMessage("這是 菜單介面"); 

        mTextFragment = textfrag; 

         

    } 

     

    private void showFragments(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 Fragment getFragmentByTag(String tag){ 

        if(FRAG_SMS.equals(tag)){ 

            return mSMSFragment; 

        } 

        if(FRAG_TEXT.equals(tag)){ 

            return mTextFragment; 

        } 

        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裡面類比了棧,但是我的回退沒有響應我設定的exit anim 這個無語還沒解決

3.再使用下ListFragment,我這裡寫的是SMSListFragment繼承了ListFragment:

public class SMSListFragment extends ListFragment{ 

     

    private ConversationListAdapter mAdapter; 

    private ConversationQuery mQuery; 

    private long startTime; 

     

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        // TODO Auto-generated method stub 

        super.onCreate(savedInstanceState); 

        mAdapter = new ConversationListAdapter(getActivity()); 

        mQuery = new ConversationQuery(getActivity().getContentResolver()); 

    } 

     

    @Override 

    public void onActivityCreated(Bundle savedInstanceState) { 

        // TODO Auto-generated method stub 

        super.onActivityCreated(savedInstanceState); 

        setListAdapter(mAdapter); 

    } 

     

    @Override 

    public void onStart() { 

        // TODO Auto-generated method stub 

        super.onStart(); 

        startAsyncQuery(); 

    } 

     

    @Override 

    public void onStop() { 

        // TODO Auto-generated method 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 class ConversationQuery extends AsyncQueryHandler { 

 

        public ConversationQuery(ContentResolver cr) { 

            super(cr); 

            // TODO Auto-generated constructor stub 

        } 

 

        @Override 

        protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 

            // TODO Auto-generated method 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()中,我們介面已經不在顯示了,所以我們不關心資料庫變化了,close cursor

4.首頁面的布局檔案:

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

 

XSuperMES移動端運用FragmentActivity適配大螢幕(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.