在Android中创建ViewPager或等效的WITH功能

时间:2012-04-10 12:17:45

标签: android http android-layout android-viewpager

我知道这可能听起来像一个可怕的问题,但我一直在研究尽可能多地解决这个问题。我有一个应用程序,需要一个视图寻呼机水平滚动显示不同的视图。在每个视图中,它需要功能,对于一个视图,它可能只是按下按钮,需要另一个视图来从服务器下载数据(例如,检索最新的Twitter提要)以及其他功能。重点是在View Viewr中,每个视图都需要功能。

我最初的想法是遵循本教程:

http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/

但是,这只是提供没有交互的视图。我已设法实现此并添加我的布局,但这只解决了一半的问题。它显示了如何在注释中添加基本操作,例如单个按钮。我希望每个视图都有自己的活动,能够做出自己独特的事情。

这是我原来的:

public class DashboardContainerActivity extends Activity{

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    //Set content view to the dashboard container xml view
    setContentView(R.layout.dashboard_container);

    //Create a new instance of my page adapter from below
    MyPageAdapter adapter = new MyPageAdapter();
    //Reference the view pager used in the dashboard container xml view
    ViewPager myPager = (ViewPager) findViewById(R.id.dashboardpanelpager);
    //set an adapter to the view pager
    myPager.setAdapter(adapter);
    //First panel to be shown when opened
    myPager.setCurrentItem(3);
  }

}

/*------------------------------------------------------*/
class MyPageAdapter extends PagerAdapter {

  public int getCount() {
      //Return 7 as there will be 7 panes in the dashboard
      return 7;
  }

  public Object instantiateItem(View collection, int position) {

      LayoutInflater inflater = (LayoutInflater) collection.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      View v = null;
      switch (position) {
      case 0:
          v = inflater.inflate(R.layout.dashboard_social, null);
          break;
      case 1:
          v = inflater.inflate(R.layout.dashboard_info, null);
          //DISPLAY INFORMATION FROM SERVER AND DISPLAY HERE
          break;
      case 2:
          v = inflater.inflate(R.layout.dashboard_allcourses, null);
          //LIST OF COURSES

          break;
      case 3:
          v = inflater.inflate(R.layout.dashboard_news, null);
          //USE HTTP HERE FOR TWITTER FEED


          break;
      case 4:
          v = inflater.inflate(R.layout.dashboard_mycourse, null);
          //DOWNLOAD USER'S PERSONAL INFORMATION AND DISPLAY HERE

          break;
      case 5:
          v = inflater.inflate(R.layout.dashboard_media, null);
          //DISPLAY LATEST UPLOADED MULTIMEDIA
          break;
      case 6:
          v = inflater.inflate(R.layout.dashboard_extras, null);
          break;
      }

      ((ViewPager) collection).addView(v, 0);

       return v;
  }

  @Override
  public void destroyItem(View arg0, int arg1, Object arg2) {
      ((ViewPager) arg0).removeView((View) arg2);

  }

  @Override
  public boolean isViewFromObject(View arg0, Object arg1) {
      return arg0 == ((View) arg1);

  }

  @Override
  public Parcelable saveState() {
      return null;
  }
 }

我为添加到ViewPager的每个布局都有单独的活动,但我猜这些活动无法添加到ViewPager中,而不仅仅是布局。

我已经阅读了有关片段的内容,但我不确定它是否与API级别8兼容,显然这是针对Honeycomb和Ice Cream Sandwich。

1 个答案:

答案 0 :(得分:3)

将Activity作为ViewPager的一部分是不可能的,但是没有理由不能将您描述的功能添加到ViewPager中的每个页面。要为每个视图中的组件分配交互或事件,只需在每个case语句中的instantiateItem()中添加正确的侦听器:

case 0:
      v = inflater.inflate(R.layout.dashboard_social, null);
      Button myButton = (Button) v.findViewById(R.id.name_of_button_in_social_dashboard);
      myButton.setOnClickListener(...);
      break;

对于任何其他交互,例如获取Twitter订阅源的http请求,只需将其作为主要活动的一部分执行(类似http请求应该在后台线程中完成)。如果要在Twitter页面中更新UI,只需使用ViewPager.getChildAt(3)来获取子元素。将您的活动视为一个大型布局,其中包含7个子视图,这些视图一次全部可用(但用户只能在刷卡时看到它们)。

尽管如此,更好的设计模式可能是使用支持ViewPager FragmentPagerAdapter的片段。这样可以将各个页面更好地逻辑分解为不同的类 - 片段还提供了其他用途,例如能够在更大的屏幕布局(平板电脑)上同时加载多个屏幕。

与ViewPager一样,Fragments可通过支持库一直返回到API Level 4(请参阅Fragment)。所以你不必担心向后兼容性。