0

プログラムで数十のビューの LinearLayout を構築し、アクティビティのコンテンツ ビューとして表示することができます。LinearLayout ツリーをたどって、ビューの背景色を変更できます。

また、onCreate() の最後にある setContentView() の呼び出しを使用して、ツリーをたどってビューの相対的な重みを調整し、ツリーを表示することができます。

色をインタラクティブに調整するための seekBar があり、それは機能します。同様に、ウェイトをインタラクティブに調整する seekBar があります。ウェイトが正しく変更されていることはわかっています。

しかし、どういうわけか、ウェイトをインタラクティブに変更した後にビューが再表示されませんが、インタラクティブに色を変更した後に再表示されます。

ウェイトを変更した後にコンテンツ ビューを再表示するにはどうすればよいですか?

4

2 に答える 2

1

requestLayout()私のために働く

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="vertical">
    <SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/seek"
        android:progress="50"
        android:max="100"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/linear">
        <View
            android:layout_width="0dp"
            android:layout_height="20dp"
            android:layout_weight="1"
            android:id="@+id/blue"
            android:background="#00f"/>
        <View
            android:layout_width="0dp"
            android:layout_height="20dp"
            android:layout_weight="1"
            android:id="@+id/red"
            android:background="#f00"/>
    </LinearLayout>
</LinearLayout>

public class MainActivity extends AppCompatActivity {
    private LinearLayout linear;
    private View red;
    private View blue;

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

        SeekBar seek = (SeekBar) findViewById(R.id.seek);
        linear = (LinearLayout) findViewById(R.id.linear);
        red = findViewById(R.id.red);
        blue = findViewById(R.id.blue);
        seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                ((LinearLayout.LayoutParams) red.getLayoutParams()).weight = 100 - progress;
                ((LinearLayout.LayoutParams) blue.getLayoutParams()).weight = progress;

                linear.requestLayout();
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }
}
于 2015-06-09T23:25:45.323 に答える
0

requestLayout() が呼び出されても重みが変わらない理由について、1 つの答えを見つけました。カロキョウのプログラムに似たプログラムを作成しましたが、XML レイアウト ファイルを使用していません。上記の karakyo のように、seekBar を使用してインタラクティブに重みを変更します。ただし、すべてのビューをプログラムで作成します。View を ViewGroup (LinearLayout など) に追加すると、addView() に指定された LayoutParams がビューにコピーされず、オブジェクトとして追加されることがわかりました。そのため、単一の LayoutParams が複数の addView() 呼び出しで提供された場合、そのように追加されたビューは同じ LayoutParams を共有します。次に、1 つのビューの重みが (getLayoutParams()).weight に割り当てることによって) 変更されると、同じ LayoutParams オブジェクトを共有するため、他のビューの重みも変更されます。どうやらXMLレイアウトからビューを膨らませるとき、

package course.example.interactiveweightexperiment;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.SeekBar;


public class WeightSeekBar extends Activity {
    private final String TAG = "WeightSeekBar-TAG";
    private LinearLayout mainLayout;
    private LinearLayout linearColors;
    private View redView;
    private View blueView;
    SeekBar weightSeekBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        redView = new View(this);
        redView.setBackgroundColor(0xff770000);

        blueView = new View(this);
        blueView.setBackgroundColor(0xff000077);

        weightSeekBar = new SeekBar(this);
        weightSeekBar.setMax(100);
        weightSeekBar.setProgress(50);

        weightSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                ((LinearLayout.LayoutParams) redView.getLayoutParams()).weight = 100 - progress;
                ((LinearLayout.LayoutParams) blueView.getLayoutParams()).weight = progress;

                linearColors.requestLayout();
                // linearColors.invalidate();
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        linearColors = new LinearLayout(this);
        linearColors.setOrientation(LinearLayout.VERTICAL);

        linearColors.addView(redView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 50));
        linearColors.addView(blueView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 50));

        /* the following does not allow the child Views to be assigned different weights.
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 50);
        linearColors.addView(redView, params);
        linearColors.addView(blueView, params);
        */

        mainLayout = new LinearLayout(this);
        mainLayout.setOrientation(LinearLayout.VERTICAL);
        mainLayout.addView(linearColors, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 19));
        mainLayout.addView(weightSeekBar, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1));

        setContentView(mainLayout);
    }
}
于 2015-06-10T21:10:11.513 に答える