7

私は本当にアンドロイドの初心者です、そして私は私のコースの仕事のためにどんな助けでもありがたいです。

私がする必要がある:

1)1つのアクティビティに2つのViewPager(ネストされていない)

2)2つのViewPager(1つのViewPagerは別のViewPagerにネストされています)

同様の質問を見つけましたが、使用できませんでした。ViewPager内のViewPager

最初にViewPagerを追加しましたが、次に何をすべきかわかりません

LayoutInflater inflater = LayoutInflater.from(this); //this - context of my activity
List<View> pages = new ArrayList<View>();
View page = inflater.inflate(R.layout.activity_main, null);
//next I adding some buttons on page
pages.add(page);

page = inflater.inflate(R.layout.activity_main2, null);  //my second page
//some buttons
pages.add(page);

page = inflater.inflate(R.layout.activity_main3, null);  //my third page
//some buttons
pages.add(page);

SamplePagerAdapter pagerAdapter = new SamplePagerAdapter(pages);
ViewPager viewPager = new ViewPager(this);
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(0);          
setContentView(viewPager);

ViewPager2を追加してsetContentView(viewPager2)と言うと、viewPager1が失われました。私はこの2つの質問に多くの時間を費やしました、助けてください...

//これは私がする必要がある私のスケッチです。申し訳ありませんが、スケッチを添付できません...

4

4 に答える 4

16

OnTouchListener私はインテリアにを追加しましたViewPager

private OnTouchListener mSuppressInterceptListener = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(
                event.getAction() == MotionEvent.ACTION_DOWN &&
                v instanceof ViewGroup
        ) {
                ((ViewGroup) v).requestDisallowInterceptTouchEvent(true);
        }
        return false;
    }
};

これは、内側のACTION_DOWNタッチイベントを検出しViewPager、外側のタッチイベントがそれを傍受するのを防ぎます。falseを返すため、ACTION_DOWNイベントのみをヒットする必要があります。他のすべてのイベントは無視されます。このリスナーを外側のスクロールから「保護」したいすべての要素に追加できますがViewPager、これらの要素で他のタッチ動作を取得したい場合は、タッチリスナー内でそれらを処理する必要があります。より良いリスナーを実装します。

于 2013-05-08T18:43:50.433 に答える
1

別のビューページャー内にビューページャーを配置することを再検討する必要があると思います。タッチイベントで多くの問題が発生するだけでなく、ユーザーエクスペリエンスが混乱したり、トリッキーになったりする可能性があります。その問題を再考することをお勧めします。

質問1:

アクティビティのxmlファイル(/layout/activity.xml)で両方のビューページャーを宣言します。次に例を示します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
            android:id="@+id/viewpager1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    <android.support.v4.view.ViewPager
            android:id="@+id/viewpager2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

</LinearLayout>

次に、アクティビティのonCreateメソッドでxmlを膨らませ、両方のビューページャーを配線します。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    mViewpager1 = (ViewPager) findViewById(R.id.viewpager1);
    mViewpager2 = (ViewPager) findViewById(R.id.viewpager2);
}

これらの2つの変数を宣言することを忘れないでくださいprivate ViewPager mViewpager1, mViewpager2;

次に、mViewpager1とmViewpager2を使用して好きなことを行うことができます。もう1つのヒントとして、各ビューページャーに手動でページを追加するのではなく、アダプターを使用してページを設定することをお勧めします。これにより、操作がはるかにクリーンで優れたものになります。

于 2014-08-07T13:39:38.557 に答える
1

ネストされたViewpagerを使用し、ネストされたViewpagerのスワイプを無効にすることに関する解決策(ネストされたボタンで選択したページを設定する場合)

ネストされたYouSubClassViewPagerの場合、次を追加します。

 public boolean onInterceptTouchEvent(MotionEvent event) {
        //if you want to send the Touches to this Viewpager (the nested) //change true to false
      return true;    
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages on this inner 

        //send swipe to father instead of child
        if (this.getParent()!=null &&  this.getParent() instanceof ViewPager) {
            ((ViewPager) this.getParent()).onTouchEvent(event);
        }
        return false;
    }

レイアウトにこれを置きます:

<com.mypackage.mycustomapp.myviews.MyViewPager
            android:id="@+id/myNestedviewpager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
于 2017-04-07T18:18:44.103 に答える
0
  1. 単一のviewPagerを使用するConcatAdapter
//sample usage
val strings = listOf("a", "b", "cde", "f", "g", "h")
viewPager.adapter = ConcatAdapter(
   strings.partition({ string -> string.length > 1 }, { string -> string.split("") })
     //{{a, b}, {c, d, e}, {f, g, h}}
      .map { StringAdapter(it) }.toList() 
)

/**
 * custom partition function as kotlin List extension
 */

fun <E> List<E>.partition(shouldFlatten: (e: E)->Boolean, flatten: (e: E)->List<E>) : List<List<E>>{
   val partitions = mutableListOf<List<E>>()
   var currentPartition = mutableListOf<E>()
   val listIterator = this.listIterator()
   while (listIterator.hasNext()) {
      val next = listIterator.next()
      if (shouldFlatten(next)) {
         if (currentPartition.isNotEmpty()) {
            partitions.add(currentPartition)
            currentPartition = mutableListOf()
         }
         partitions.add(flatten(next))
      } else {
         currentPartition.add(next)
      }
   }
   if (currentPartition.isNotEmpty()) {
      partitions.add(currentPartition)
   }
   return partitions
}
于 2021-02-27T20:30:26.033 に答える