1

これはひどい質問のように聞こえるかもしれませんが、私はこれを理解するためにできる限り調査してきました. ビューページャーを水平方向にスクロールしてさまざまなビューを表示する必要があるアプリケーションがあります。各ビュー内には、ボタンを押すだけのビュー、サーバーからデータをダウンロードするビュー (最新の Twitter フィードの取得など)、およびその他の機能が必要な機能が必要です。要点は、View Pager 内では各ビューに機能が必要であるということです。

私の最初のアイデアは、このチュートリアルに従うことでした:

http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizo​​ntal-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 と互換性があるかどうかはわかりません。どうやらこれはハニカムとアイス クリーム サンドイッチを対象としているようです。

4

1 に答える 1

3

ViewPager の一部として Activity を持つことはできませんが、説明した機能を 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を使用して Fragments を使用することは、より良い設計パターンかもしれません。これにより、さまざまなページをさまざまなクラスに論理的に分割することができます。フラグメントは、大きな画面レイアウト (タブレット) で一度に複数の画面をロードできるなど、他の用途も提供します。

ViewPager と同様に、フラグメントはサポート ライブラリを介して API レベル 4 まで使用できます ( Fragmentを参照)。したがって、下位互換性について心配する必要はありません。

于 2012-04-10T13:29:47.697 に答える