android - 在 Android 中创建具有功能的 ViewPager 或等效项

标签 android http android-layout android-viewpager

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

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

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

但是,这只是提供没有交互的 View 。我已经设法实现了这一点并添加了我的布局,但这只解决了一半的问题。它展示了如何在评论中添加基本操作,例如单个按钮。我希望每个 View 都有自己的 Activity ,能够做自己独特的事情。

这是我最初拥有的:

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 的布局都有单独的 Activity ,但我猜测这些 Activity 不能添加到 ViewPager 而不仅仅是布局。

我读过一些关于 fragment 的内容,但我不确定它是否与 API 级别 8 兼容,显然这是针对 Honeycomb 和 Ice Cream Sandwich 的。

最佳答案

不可能将 Activity 作为 ViewPager 的一部分,但是没有理由不能将您描述的功能添加到 ViewPager 中的每个页面。要将交互或事件分配给每个 View 中的组件,只需在每个 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 请求,只需将它们作为主要 Activity 的一部分执行(当然,像 http 请求这样的事情应该在后台线程中完成)。当您想更新 Twitter 页面中的 UI 时,只需使用 ViewPager.getChildAt(3) 获取子元素即可。将您的 Activity 想象成一个包含 7 个 subview 的大布局,这些 View 同时可用(但用户只会在滑动时看到它们)。

综上所述,更好的设计模式可能是使用带有 FragmentPagerAdapter 的 Fragments支持你的 ViewPager。这允许将各种页面更好地逻辑分解为不同的类 - fragment 还提供其他用途,例如能够为更大的屏幕布局(平板电脑)一次加载多个屏幕。

与 ViewPager 一样,Fragments 可以通过支持库(参见 Fragment )一直使用到 API 级别 4。因此您无需担心向后兼容性。

关于android - 在 Android 中创建具有功能的 ViewPager 或等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10088647/

相关文章:

c - HTTP 服务器编程

c# - 设置 Httpresponse 的 Response Body

Android View 布局设计帮助

android - TextView Html格式

android - API - 适用于 iOS 和 Android 的图像尺寸(不同屏幕尺寸)- 优化

androidannotations 4.0.0 不显示布局

android - 如何将图像从 http 流式传输到 CursomAdapter(Android)

javascript - 如何使用 Cordova 在 iOS 上向 Facebook 好友发送邀请?

wordpress - 当用户离开页面时,如何强制将 URL 从 https 更改为 http

android - 了解 drawRect 或绘图坐标在 Android 中的实际工作方式