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 のトリミングに注意してください) で、下は使用していません。
更新:画像ビューの画像の元の高さは、画面よりも大きくなっています。したがって、縮小する必要があります (そのため、重み 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>