Fragment在《暗黑3天梯榜》中使用的情境,暗黑3天梯熱門排行榜

來源:互聯網
上載者:User

Fragment在《暗黑3天梯榜》中使用的情境,暗黑3天梯熱門排行榜
Fragment在《暗黑3天梯榜》中使用的情境

在《Android編程權威指南》中採用了一種激進的態度來對待Fragment,即“總是使用fragment原則”。《Android編程權威指南》英文名稱是《Android Programming the big nerd ranch guide》,很多技術文章都是基於這本書的,在還不是很瞭解的情況下,我盲目的遵循了這個激進的觀點。開發出了我的這個App《暗黑3天梯榜》。

事實就是,就目前來說這個激進的觀點帶給了我很大的好處。

概述

我在以下這些地方使用了fragment

  • 進度條(閃屏?)。
  • 需要返回資料的選擇介面。
  • 資料列表介面。

確切的說,我每個介面都是fragment。fragment最直觀的好處就是對UI的自適應是極好的,可以說是吧很多問題都提前擋在了外面。在傳遞資料方面有arguments。在App中到處都充斥著下面這樣的代碼

ProgressbarFragment newFragment = new ProgressbarFragment();Bundle args = new Bundle();args.putInt(ProgressbarFragment.ARG_POSITION, position);newFragment.setArguments(args);FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.replace(R.id.fragmentContainer, newFragment,"progress");transaction.commit();

上面是一段代碼,用來傳遞進度條進度的資料,poison代表了進度100種的某個數字。在ProgressbarFragment用下面的辦法可以得到傳遞過去的資料


int position = getArguments().getInt(ARG_POSITION);

一直到這裡可能都很普通,沒有發現什麼問題。在手機中左看看右看看也沒有啥問題。是的,現在不會有問題,以後也不會有問題。這一切的原因是因為《Android 編程權威指南》中已經幫你迴避了很多問題。

Activity重新建立時,會重新構建它所管理的Fragment,原先的Fragment的欄位值將會全部丟失,但是通過 Fragment.setArguments(Bundle bundle)方法設定的bundle會保留下來。所以盡量使用 Fragment.setArguments(Bundle bundle)方式來傳遞參數。

需要返回資料的選擇介面中使用Fragment

首先我們要建立一個Fragment,在這個Fragment裡面我們要返回資料,我們要申明一個介面,並且在需要接受資料的地方重寫這個介面。

public class ChoseServerFragment extends Fragment {    private ArrayAdapter<String> mAdapter;    private String[] servers;    public static String FRAGMENT = "com.example.lijing.diablo3armory.choseserverfragment";    OnArticleSelectedListener mListener;    public interface OnArticleSelectedListener {        public void onServerSelected(String servername);    }    @Override    public void onAttach(Activity activity) {        super.onAttach(activity);        try {            mListener = (OnArticleSelectedListener) activity;        } catch (ClassCastException e) {            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");        }    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        // Inflate the layout for this fragment        View v = inflater.inflate(R.layout.server_fragment, container, false);        iniListView(v);        return v;    }    private void iniListView(View v) {        servers = getActivity().getResources().getStringArray(R.array.servers);        ListView serverListView = (ListView)v.findViewById(R.id.choseServerListView);        mAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_expandable_list_item_1,servers);        serverListView.setAdapter(mAdapter);        serverListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {                String servername = servers[i];                mListener.onServerSelected(servername);            }        });    }}

在代碼中介面是這樣申明的

OnArticleSelectedListener mListener;public interface OnArticleSelectedListener {    public void onServerSelected(String servername);}

然後在onItemClick()中這樣調用

mListener.onServerSelected(servername);

在這個Fragment裡我們需要顯示一個Layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:orientation="vertical"              android:layout_width="match_parent"              android:layout_height="match_parent">    <TextView        android:gravity="center"        android:text="@string/choseyourserver"        android:textSize="20dp"        android:layout_width="fill_parent"        android:layout_height="wrap_content"/>    <ListView        android:id="@+id/choseServerListView"        android:layout_width="fill_parent"        android:layout_height="fill_parent">        </ListView></LinearLayout>

這裡顯示了一個伺服器列表,她的效果是這個樣子的。

在這個App中,我是在Activity中調用的這個Fragment。首先要implements,這個介面。

public class MainActivity extends FragmentActivity    implements ChoseServerFragment.OnArticleSelectedListener{

然後在重寫這個介面在這個Activity裡。

@Overridepublic void onServerSelected(String servername) {    ChoseServerFragment fragment = (ChoseServerFragment)getSupportFragmentManager()            .findFragmentByTag(ChoseServerFragment.FRAGMENT);    if(fragment != null) {        savePreferences(servername);        ChoseServerFragment removeFragment = (ChoseServerFragment)getSupportFragmentManager().findFragmentByTag(ChoseServerFragment.FRAGMENT);        getSupportFragmentManager().beginTransaction().remove(removeFragment);        iniApp();    }}

這個Fragment,只需要重寫這個介面就可以了,無論是在Activity或者Fragment裡都可以。

小結

本章描述了第二種方式使用Fragment(第一種方式參看http://www.cnblogs.com/canglin/p/4439666.html)。大概有如下優點

  • UI具有更好的適應能力。
  • Bundle資料不會丟失。
  • 可重用性極高。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.