http://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及更高版本,有更多的功能的兼容性库中没有找到。