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);
}
}