Fragment在Activity中的應用


在本小節中介紹在Activity中創建Fragment。

官網有很詳細的介紹http://developer.android.com/guide/components/fragments.html。介紹了Fragment的生命周期,Android3.0引入了Fragmen的概念,使UI靈活地適用於各種設備。具體原理就不多贅述了,請參考官網。

Fragment可以包含於多個Activity,可以使應用適配到不同的屏幕尺寸。當屏幕尺寸足夠大時,一個Activity可以包含多個Fragment,不屬於這種情況時,會啟動另一個Activity包含不同的Fragment。

1 創建一個空的Activity

我們首先創建一個空的Activity,水平排列。如下所示

res/layour/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
</LinearLayout>

com/fragment/FragmentDemoActivity.java:

package com.fragment;

import android.app.Activity;
import android.os.Bundle;

public class FragmentDemoActivity extends Activity {
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);
    }
}

 

2 創建Fragment

我們創建兩個Fragment,一個是目錄TitlesFragment,一個是詳情DetailsFragment。

TitlesFragment集成ListFragment,實現目錄列表。

com/fragment/TitlesFragment.java:

package com.fragment;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.FragmentTransaction;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class TitlesFragment extends ListFragment {
    static String[] array;

    boolean mDualPane;
    int mCurCheckPosition = 0;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }
    
    @Override
    public void onPause() {
        super.onPause();
    }
    
    
    @Override
    public void onStop() {
        super.onStop();
    }
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }
    
    @Override
    public void onStart() {
        super.onStart();
    }
    
    @Override
    public void onResume() {
        super.onResume();
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        array = getResources().getStringArray(R.array.countries_array);
        setListAdapter(new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, array));

        View detailsFrame = getActivity().findViewById(R.id.details);

        mDualPane = detailsFrame != null
                && detailsFrame.getVisibility() == View.VISIBLE;

        if (savedInstanceState != null) {
            mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); //從保存的狀態中取出數據
        }

        if (mDualPane) {
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            showDetails(mCurCheckPosition);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice", mCurCheckPosition);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        showDetails(mCurCheckPosition);
    }

    void showDetails(int index) {
        mCurCheckPosition = index; 
        if (mDualPane) {
            getListView().setItemChecked(index, true);
            DetailsFragment details = (DetailsFragment) getFragmentManager()
                    .findFragmentById(R.id.details); 
            if (details == null || details.getShownIndex() != index) {
                details = DetailsFragment.newInstance(mCurCheckPosition); 

                //得到一個fragment事務(類似sqlite的操作)
                FragmentTransaction ft = getFragmentManager()
                        .beginTransaction();
                ft.replace(R.id.details, details);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();//提交
            }
        } else {
            new AlertDialog.Builder(getActivity()).setTitle(
                    android.R.string.dialog_alert_title).setMessage(
                    array[index]).setPositiveButton(android.R.string.ok,
                    null).show();
        }
    }

}

DetailsFragment顯示點擊某個目錄的詳情,com/fragment/DetailsFragment.java:

package com.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ScrollView;
import android.widget.TextView;

public class DetailsFragment extends Fragment {
    static String[] array;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }
    
    public static DetailsFragment newInstance(int index) { 
        DetailsFragment details = new DetailsFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        details.setArguments(args);
        return details;
    }

    public int getShownIndex() {
        return getArguments().getInt("index", 0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        if (container == null)
            return null;

        array = getResources().getStringArray(R.array.countries_array);
        
        ScrollView scroller = new ScrollView(getActivity());
        
        /*GridView gridview = (GridView) getActivity().findViewById(R.id.gridview);
        gridview.setAdapter(new ImageAdapter(getActivity()));

        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                Toast.makeText(DetailsFragment.this.getActivity(), " " + position, Toast.LENGTH_SHORT).show();
            }
        });*/
        
        /*//定義UI組件
        final ImageView iv= (ImageView)getActivity().findViewById(R.id.ImageView01);
        Gallery g = (Gallery) getActivity().findViewById(R.id.Gallery01);

        //設置圖片匹配器
        g.setAdapter(new ImageAdapter(getActivity()));

        //設置AdapterView點擊監聽器,Gallery是AdapterView的子類
        g.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                //顯示點擊的是第幾張圖片
                Toast.makeText(DetailsFragment.this.getActivity(), "" + position,
                        Toast.LENGTH_LONG).show();
                //設置背景部分的ImageView顯示當前Item的圖片
                iv.setImageResource(((ImageView)view).getId());
            }
        });*/
        
        
        TextView text = new TextView(getActivity());

        int padding = (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 4, getActivity()
                        .getResources().getDisplayMetrics());
        text.setPadding(padding, padding, padding, padding);
        scroller.addView(text);

        text.setText(array[getShownIndex()]);
        
        /*Button btnContact = (Button) getActivity().findViewById(R.id.bt1);
        btnContact.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(getActivity(), MainHelloGallery.class);
                startActivity(intent);
            }
        });*/
        
        return scroller;
    }
    
    /*@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // TODO Auto-generated method stub
        super.onCreateOptionsMenu(menu, inflater);
         menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
            menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        Toast.makeText(getActivity(), "index is"+getShownIndex()+" && menu text is "+item.getTitle(), 1000).show();
        return super.onOptionsItemSelected(item);
    }*/
}

 

3 將Fragment添加至Activity中

此時,已經實現了Activity和兩個Fragment,將Fragment添加至Activity有兩種方式。

3.1 在activity的layout文件中聲明fragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

   <fragment
       android:id="@+id/titles"
       android:layout_width="0px"
       android:layout_height="match_parent"
       android:layout_weight="0.31"
       class="com.fragment.TitlesFragment" />
   
   <FrameLayout android:id="@+id/details" android:layout_weight="1" android:layout_width="0px" android:layout_height="match_parent"
       android:background="?android:attr/detailsElementBackground" >
   </FrameLayout>
</LinearLayout>

3.2 在Activity中管理Fragment

在Activity中管理fragment, 需要使用FragmentManager. 通過調用activity的getFragmentManager()取得它的實例。

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.main);

  FragmentManager fragmentManager = getFragmentManager();
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

  TitlesFragment titleFragment = new TitlesFragment();
  DetailsFragment detailsFragment = new DetailsFragment();   fragmentTransaction.add(R.id.titles, titleFragment);   fragmentTransaction.add(R.id.details, detailsFragment);   fragmentTransaction.commit();
}

 

效果圖如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM