2

ScrollViews に関する通常の質問は、fillViewport を使用して ScrollView を画面全体に拡大する方法のようです。私の問題は似ていますが、逆になります:)

複数の要素を含む LinearLayout を取得しました。1 つの要素を除くすべての要素の高さは固定されています。特別な要素は、残りのスペースを埋めるために拡大する必要がある ImageView です。これはうまくいきます:)

ここで、LinearLayout を ScrollView に配置したいと考えています。これは、要素の一部が実行時に展開される必要があるためです (たとえば、TextView を展開する「詳細」アイコンをクリックします)。展開されていないバージョンでは、ScrollView が存在しないかのように、すべての要素が画面に収まるようにしたいと考えています。

残念ながら、ScrollView を LinearLayout の周りにラップすると、ImageView が maxSize にスケーリングされ、画面が画面に収まりません。私の目標を達成する方法はありますか?

サンプルアプリで問題を再現して、あなたと共有しました:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <ImageView
            android:layout_width="fill_parent"
            android:layout_height="0px"
            android:layout_weight="1"
            android:background="#ffff0000"
            android:scaleType="fitCenter"
            android:src="@drawable/background" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="80dp"
        android:background="#ff00ff00"
        android:text="element 2"
        tools:context=".MainActivity" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="80dp"
            android:background="#ff00ff00"
            android:text="element 1"
            tools:context=".MainActivity" />
    </LinearLayout>

</ScrollView>

2 つのバージョンのスクリーンショットを次に示します。

ScrollView 内のスクリーンショット (要素 1 のスクロールバーとトリミングに注意してください) ScrollView なしのスクリーンショット

上は ScrollView を使用したレイアウト (スクロールバーと要素 1 のトリミングに注意してください) で、下は使用していません。

更新:画像ビューの画像の元の高さは、画面よりも大きくなっています。したがって、縮小する必要があります (そのため、重み 1 と scaleType が設定されています)。

解決策:次のコードで問題が解決しました(Luksprogの回答に基づく)

メイン アクティビティ (抜粋、ImageView をクリックするとレイアウトの変更が誘発されます):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    scrollView = (ScrollView) findViewById(R.id.scroller);
    frame = (FrameLayout) findViewById(R.id.frame);
    layout = (LinearLayout) findViewById(R.id.layout);

    final ImageView image = (ImageView) findViewById(R.id.image);
    image.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            ImageView image = (ImageView) findViewById(R.id.image);
            frame.removeView(layout);
            scrollView.addView(layout);
            image.getLayoutParams().height = image.getHeight();
        }
    });

}

レイアウト XML ファイル

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     >

    <ScrollView 
        android:id="@+id/scroller"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:fillViewport="true"
        >

    </ScrollView>

    <LinearLayout
        android:id="@+id/layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/image"
            android:layout_width="fill_parent"
            android:layout_height="0px"
            android:layout_weight="1"
            android:background="#ffff0000"
            android:scaleType="fitCenter"
            android:src="@drawable/background" />

        <TextView
            android:id="@+id/text1"
            android:layout_width="fill_parent"
            android:layout_height="80dp"
            android:background="#ff00ff00"
            android:text="element 2"
            tools:context=".MainActivity" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="80dp"
            android:background="#ff00ff00"
            android:text="element 1"
            tools:context=".MainActivity" />
        <TextView
            android:layout_width="fill_parent"
            android:layout_weight="0.1"
            android:layout_height="0px"
            android:background="#ff00ff00"
            android:text="element 3"
            tools:context=".MainActivity" />
    </LinearLayout>

</FrameLayout>
4

2 に答える 2

2

コメントで述べたように、あなたがしようとしていることが xml レベルで可能かどうかはわかりません。1 つのオプションは、現在のレイアウトを変更しFrameLayout、最初に を追加するルートを追加し、ScrollViewその上にLinearLayout. この位置ではImageView、ユーザーがレイアウトを変更していないため、 は希望どおりに動作します。レイアウトにさらに表示する必要がある場合はLinearLayout、ビュー階層から を切り離し ( を使用removeView)、 にアタッチしますScrollView( を使用addView)。ユーザーが最初のレイアウトに戻ったら、これを逆にします。

これによりImageView、ビューを切り替えるときに の高さが異なるため、切り替えを行うときに の高さを取得してImageView再設定する必要があります。高さを取得するには、リスナーで行うか、 inpostメソッドを使用しonCreateます (その時点ではまだビューがレイアウトされていないため)。また、ユーザーが電話を回す可能性があることを覚えておいてください。これがレイアウトに影響するかどうかはわかりませんが、考慮してください。

于 2012-11-01T10:18:00.123 に答える
0

Firstly i tried running your code and it didn't cause any issue for me. The scrollView did not show up although the image was scaled to a ScreenHeight-160dp height which i expected because you have used weight 1 for this imageview.

I would suggest that you remove the weight and give height as wrapcontent. In that case the Imageview will just enclose the Image. When it becomes bigger in size, automatically scrollview come into use if the total heights of all screen contents is more than the screenheight.

于 2012-10-31T20:19:26.837 に答える