0

さて、ユーザーがスワイプしてさまざまな「ページ」を表示できる水平スクロールビューを持つアクティビティを構築しようとしています。私の考えでは、これらの「ページ」はビューになります。以下は私のアイデアのモックアップです(動作するかどうかを確認するため)

私はこれを次のように実験しました:

私のコンテンツビューはスクロールビューに設定されています。(これが間違ったアプローチかどうかは不明)

スクロールビューを作成し、次のようにビューを配置します。

private void setupScrollView()
{
    Display display = getWindowManager().getDefaultDisplay();
    DisplayMetrics outMetrics = new DisplayMetrics ();
    display.getMetrics(outMetrics);

    float density  = getResources().getDisplayMetrics().density;
    float dpHeight = outMetrics.heightPixels / density;
    float dpWidth  = outMetrics.widthPixels / density;

    int width = (int)MeasureUtils.convertDpToPixel(dpWidth, getApplicationContext());
    int height = (int)MeasureUtils.convertDpToPixel(dpHeight, getApplicationContext());

    _scrollView = new HorizontalScrollView(getApplicationContext());
    _scrollView.setBackgroundColor(Color.CYAN);
    _scrollView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

     Log.i("DEBUG", "Screen dp width = " + dpWidth + " screen dp height = " + dpHeight);

    TextView view = new TextView(getApplicationContext());
    view.setBackgroundColor(Color.RED);
    view.setText("TEST");

    view.setX(0); // Start at the left of the scrollview.

    view.setWidth(width); // Size it so that it fills to the right of the scrollview.

    TextView view2 = new TextView(getApplicationContext());
    view2.setBackgroundColor(Color.GREEN);
    view2.setText("TEST2");

    view2.setX(width); // Start the second "page/view" offscreen to the right where i can scroll to it

    view.setWidth(width); // Fill the screen width

    LinearLayout layout = new LinearLayout(getApplicationContext());
    layout.setBackgroundColor(Color.MAGENTA);

    layout.addView(view);

    layout.addView(view2);

    _scrollView.addView(layout);
}

上記のアイデアは、画面を占有し、ページを表すビューが表示されるということです。このビューの色は「RED」である必要があります。次に、右に水平にスクロールすると、次のページを表す 2 番目のビュー (view2) が表示されます。このビューの色は「GREEN」である必要があります。これは起こりません。画面の 1/3 または 1/2 が view1 であり、linearlayout がほぼ画面全体を占めているように見えます (スクロールビューからの CYAN がにじみ出る右端に少し隙間があります)。

私はこれに間違った方法で取り組んでいますか、そして/または私が行っている方法でこれを機能させることは可能ですか?

4

2 に答える 2

1

さて、私は自分が間違っていたことを理解しました。それは非常に小さなものであることが判明しました...

完全なコードは次のとおりです。

    private void setupScrollView()
{
    Display display = getWindowManager().getDefaultDisplay();
    DisplayMetrics outMetrics = new DisplayMetrics ();
    display.getMetrics(outMetrics);

    float density  = getResources().getDisplayMetrics().density;
    float dpHeight = outMetrics.heightPixels / density;
    float dpWidth  = outMetrics.widthPixels / density;

    int width = (int)MeasureUtils.convertDpToPixel(dpWidth, getApplicationContext());
    int height = (int)MeasureUtils.convertDpToPixel(dpHeight, getApplicationContext());

    _scrollView = new HorizontalScrollView(getApplicationContext());
    _scrollView.setBackgroundColor(Color.CYAN);
    _scrollView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    Log.i("DEBUG", "Screen dp width = " + dpWidth + " screen dp height = " + dpHeight);

    TextView view = new TextView(getApplicationContext());
    view.setBackgroundColor(Color.RED);
    view.setText("TEST");

    view.setX(0);

    view.setWidth(width);
    view.setHeight(height - 50);

    TextView view2 = new TextView(getApplicationContext());
    view2.setBackgroundColor(Color.GREEN);
    view2.setText("TEST2");

    view2.setX(0);

    view2.setWidth(width);
    view2.setHeight(height - 50);

    LinearLayout layout = new LinearLayout(getApplicationContext());
    layout.setBackgroundColor(Color.MAGENTA);

    layout.addView(view);

    layout.addView(view2);

    _scrollView.addView(layout);


}

これは、私が持っていたように、プログラムで水平スクロールビューを作成しますが、問題は、次のように「0」に設定する必要があるときに、2番目のビューを「幅」に設定していたことです。

view2.setX(0);

これで、スワイプできるスクロールビューのページに似た 2 つの「ビュー」が得られます。それぞれがページ全体を占めています。

コードを閉じるのが嫌いで、見逃したのは簡単な修正です:|

これが、この方法でやろうとする他の人の助けになることを願っています。Frankが提案したように、PageViewerを調べます。

于 2013-06-18T21:41:29.540 に答える
1

おそらく、「ページ」を作成するために水平スクロール ビューを使用したくないでしょう。PageViewerを見てみる

これにより、すべての sywpe およびインフレ ロジックが自動的に組み込まれます。

基本的に、特定のページをインフレートするための呼び出しが行われます。そこでビューを作成し (必要に応じて動的に)、レンダリングするルートを返すだけです。

于 2013-06-18T21:33:30.523 に答える