1. 程式人生 > >同一介面中多個Fragment中的控制元件ID衝突問題的解決

同一介面中多個Fragment中的控制元件ID衝突問題的解決

當一個介面同時含有多個Fragment時,有可能這些Fragment中所對應的佈局檔案中的控制元件ID出現相同的情況,這時如果程式碼處理不當,則會出現某個Fragment中的某操作作用到另外一個Fragment中去了。

例如:某Activity中同時嵌入了兩個Fragment,在fragment1.xml和fragment2.xml中都含有id為listView1這個控制元件

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

然後在不同的Fragment所對應的程式碼中使用如下程式碼獲得相應控制元件

mListView = (ListView)getActivity().findViewById(R.id.listView1);
這時獲得的這個控制元件物件有可能不是本Fragment中的(如:在fragment1中獲得了fragmnet2中的id為R.id.listView1的控制元件),如此會造成操作錯位而形成混亂。究其原因,通過Activity中的findViewById,它會遍歷Activity其中嵌入的所有控制元件,找到第一個符合的即返回,而這個第一個不一定是本Fragmnet中的,這個問題在編譯期間是得不到提示的。
為了解決這個問題,或許我們可以修改相應Fragment的佈局檔案中控制元件的id標識,使得多個Fragment間的控制元件id不重複。 但是我們使用Fragment有一個很大的目的是為了程式碼複用的方便(從一個project轉移到另外一個project),而上述的解決方法則顯得很不方便。

在Fragment中找到內部的控制元件

可以在onCreateView中建立Fragment的View時,使用這個View查詢控制元件,程式碼示例如下:


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View myFragment = inflater.inflate(R.layout.fragment_page2, container, false);
        mListView = (ListView)myFragment.findViewById(R.id.listView1);
        . . .
return myFragment;
}

如果要在Fragment其他函式中要找其中的控制元件,可以先使用Fragment的getView來先獲得View,然後再使用findViewById來找到相應的空間。

在Activity中找到某Fragment中的某控制元件

從封裝的角度來看,一般Activity不要干涉Fragment的內政(呵呵,用上外交語言了),但如果確實需要的話,可以先獲得FragmentManager物件(通過getFragmentManager),然後通過在通過FragmentManager中的findFragmentById或者findFragmentByTag來找到相應的Fragment,在使用Fragment的getView,再使用findViewById即可找到相應的控制元件。

總之,一個Activity中含有Fragment時,一定要注意控制元件Id的衝突問題,正確處理