Android 構建用戶界麵與Android的碎片
https://www.developer.com/ws/android/development-tools/building-uis-with-android-fragments.html
雖然片段簡化了編碼的動態用戶界麵,使用它們的有一個小的開銷成本。雖然你的布局將最終確定的代碼片段顯示,仍然需要做出決定,以確定是否要更新現有的片段,或推出一個新的活動,該片段應不存在於當前活動內容。
例如,下麵的代碼使用的findFragmentById()方法,以確定是否一個片段是在一個特定的布局。如果沒有定義,推出一個新的活動,以顯示該片段。
@Override public void onListItemSelected(int index) { SampleViewerFragment imageViewer = (SampleViewerFragment) getSupportFragmentManager() .findFragmentById(R.id.image_viewer_fragment); if (imageViewer == null || ! imageViewer.isInLayout()) { Intent showImage = new Intent(getApplicationContext(), SampleViewerActivity.class); showImage.putExtra("index", index); startActivity(showImage); } else { imageViewer.update(index); } }
您還需要的隻是像以前的許多活動課,雖然不是所有人都可以使用每個設備上。有什麼理由不來設計你的應用程序的片段,即使您目前的UI設計或目標設備不要求他們在這個時候。在未來,支持多種設備時,大多數應用程序可能會找到好的用例的片段,雖然遊戲使用他們自己的框架,通過OpenGL實現與所有的用戶界麵可能是一個合理的異常。
由於現在用戶交互的情況通常發生在,片段本身,則需要進行編碼的邏輯,以確定是否啟動一個活動中的與片段本身,或從父活動。無論哪種方式,需要一些通信之間的片段和其活性。任何片段可以調用getActivity()方法來確定它存在於Activity類的。從那裏,調用活動的UI方法可以使片段,以確定更多的屏幕和布局。或者,更簡單,片段可以隻調用一個方法,在一個活動中,但此檢查需求。通過一個偵聽器對象通過添加一個回調,我們已經走了這條路線。定製的片斷類和監聽器的接口中定義的方法來實現在Activity類的。下麵是一個完整的實施的ListFragment類:
public class SampleListFragment extends ListFragment { private int index = 0; private ListItemSelectedListener selectedListener; @Override public void onListItemClick(ListView l, View v, int position, long id) { index = position; selectedListener.onListItemSelected(position); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setListAdapter(ArrayAdapter.createFromResource(getActivity(), R.array.image_titles, android.R.layout.simple_list_item_1)); if (savedInstanceState != null) { index = savedInstanceState.getInt("index", 0); selectedListener.onListItemSelected(index); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("index", index); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { selectedListener = (ListItemSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement ListItemSelectedListener in Activity"); } } public interface ListItemSelectedListener { public void onListItemSelected(int index); } }
正如你可以看到,這個方法很簡單。適配器被設置在onActivityCreated()方法。的片段連接到一個活動時,監聽器分配和使用活動在的onAttach()方法通過實例驗證。當用戶點擊ListView中的一個項目,監聽器被觸發調用onListItemSelected() ,我們已經實現了在活動類。狀態保存和恢複。
這裏一個有趣的方麵是savedInstanceState onActivityCreated()方法的使用。從表麵上看,這看起來隻是保存該項目正在查看和恢複,。當方向發生變化,實例數據保存,這部分代碼被觸發。如果方向從兩個片段視圖切換到單一片段視圖,活性保持不變,這是活性,將隻顯示列表。但是,一旦觸發此代碼的意圖,最終推出的瀏覽器活動被觸發。所以,當你從風景到人像(在本例中)旋轉的觀眾活動。按返回鍵的用戶返回到列表中。讓我們談論的觀眾活動。
我們啟動查看器活動,當觀看者的片段中沒有定義的當前活動。本次活動還必須了解觀眾的片段,它可能需要的任何配置。正如你看到的上麵的代碼清單,這個信息被發送到其他活動,使用的意圖額外的參數傳遞。然後,此信息傳遞到片段在用同樣的方式。下麵是完整的代碼的瀏覽器活動,在自己的屏幕上顯示的片段:
public class SampleViewerActivity extends FragmentActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { finish(); return; } setContentView(R.layout.image_viewer_activity); Intent launchingIntent = getIntent(); int index = launchingIntent.getIntExtra("index", 0); SampleViewerFragment viewer = (SampleViewerFragment) getSupportFragmentManager() .findFragmentById(R.id.image_viewer_fragment); viewer.update(index); } }
正如你所看到的,它隻是一種方式來顯示的觀眾片段。一個有趣的方麵是,如果它的onCreate()方法被調用時,該設備已切換為橫向模式,它完成後,將用戶返回到上一個屏幕。隻有當它被用於對景觀的屏幕,這種方法效果很好。如果您選擇使用它的在其他屏幕方向配置,這是必須更新以匹配。對於本示例,創建方向之間的平滑過渡。
觀眾片段是非常簡單的。膨脹一個布局資源,並返回一個View對象作為onCreateView()方法被調用的結果。然後,它有一個執行的update()方法,你已經看到了幾次。這是所有有給它。您可以查看在線代碼庫中的代碼。
現在,當用戶從縱向模式旋轉為橫向模式,屏幕切換屏幕(活動)模式下的雙片段模式從單一的片段。您可以添加更多的替代布局,以更好地控製一下不同類型的屏幕上。例如,您可能隻需要兩個片段的布局時,大屏幕平板電腦。而不是把替代布局資源/布局土地目錄,你可以把它的/布局的XLARGE土地目錄。這是一個情況下,你需要更新的瀏覽器活動,完不成隻是當屏幕方向改變。
在這裏,我們看到的景觀視野:
如果你改變方向的景觀,你會看到相同的圖像:
按返回按鈕,返回到列表視圖中:
結論
片段API,在Android 3.0推出,是一個偉大的API用於創建靈活,動態的用戶界麵。你已經學會了如何快速創建一個動態的用戶界麵,可以步行通過整個應用程序的外觀和行為不同的屏幕方向和屏幕尺寸的片。因為這個功能是通過一個兼容庫,任何應用程序為目標的Android 1.6及以後可以從這些改進中獲益,以靈活的用戶界麵。這是一個簡要的介紹片段API,其中有許多更有趣的功能,如過渡,後退堆棧,對話片段,以及更多。當目標的Android 3.0及更高版本,有更多的功能的兼容性庫中沒有找到。
最後更新:2017-04-02 15:15:00