RelativeLayoutにstuffを追加するときに、どのようなシーケンスが呼び出されているのか少し問題があります。私は、RelativeLayoutを作成し、そのRelativeLayoutにいくつかのカスタムビュー(名前はcusView)を入れたいところで、Activity(名前はRelActivity)というクラスを拡張しています。カスタムビューのtopMarginとleftMarginは、別のカスタムViewの位置を使用して計算されます(つまり、最初のカスタムViewは、数値をtopMarginとleftMarginに設定して直接配置する必要があります)。この場合、RelativeLayoutのルールでは不十分であることに注意してください。Androidビューの幅はいつ設定されますか?
だから、問題になる。私のRelActivityで私はこれを実行します。
- がcusViewsとカーソルが最初cusViewのためのデータベース
- から受け取っRelativeLayout(名前、それrelLayout)
- 反復を作成する - > TOPMARGINとLEFTMARGINによって設定された位置を使用してLayoutParameter
- 他cusViewsの場合 - >他のcusViewsのいずれかを使用して、TOPMARGINとLEFTMARGINを計算し、LayoutParameter
- 設定RelActivityのcontentView relLayout
leftMarginとtopMarginの両方が常にゼロと計算されるため、最初のものはすべて左上隅に押し込まれます。これは、私がtopMarginとleftMarginを計算するためにcusViewsの幅を使用し、cusViewの幅がまだ値を与えていないために起こります。
幅は、cusViewのオーバーライドされたメソッドonSizeChanged()で最初に計算されますか?レイアウトが画面に表示されるときに、onSizeChanged()メソッドが最初に呼び出されますか?もしそうなら、この問題を回避するにはどうすればいいですか? onSizeChanged()が実行された後の位置を計算する必要がありますか?
編集:ここでは
RelActivityの私のonCreateである:ここでは最小実施例である
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
relLayout = new RelativeLayout(this);
cusViews = new ArrayList<CusView>();
listParams = new ArrayList<RelativeLayout.LayoutParams>();
readDBandSetLayout();
setContentView(relLayout);
}
ここですべてを提示するreadDBandSetLayout()メソッドでは、あまりにも多くの情報があります。以下は最も重要な詳細です。私はそれが正常に動作し、次のようにLayoutParamsを作成する場合は、cusViewsを下向きにして右方向にお互いの記載されています:
else{
LayoutParams p = new LayoutParams(this.getResources().getDimensionPixelSize(R.dimen.large),this.getResources().getDimensionPixelSize(R.dimen.large));
//Here I want to calculate cusView2Topmargin and cusView2Leftmargin based on the widths of the first or previosly positioned cusViews. But here the widths are 0 since they haven't been calculated yet.
p.topMargin = cusView2Topmargin; //Always zero
p.leftMargin = cusView2Leftmargin; //Always zero
listParams.add(p);
}
:
queryCursor = customApplication.customData.query(number); //Fetches cursor
for (int i = 0; i < numberOfRows; i++){
if (i == 0){
LayoutParams p = new LayoutParams(this.getResources().getDimensionPixelSize(R.dimen.small), this.getResources().getDimensionPixelSize(R.dimen.small));
p.topMargin = 50;
p.leftMargin = 50;
listParams.add(p);
}
else{
LayoutParams p = new LayoutParams(this.getResources().getDimensionPixelSize(R.dimen.large),this.getResources().getDimensionPixelSize(R.dimen.large));
p.addRule(RelativeLayout.BELOW, cusViews.get(i-1).getId());
p.addRule(RelativeLayout.RIGHT_OF, cusViews.get(i-1).getId());
listParams.add(p);
}
relLayout.addView(cusViews.get(i), listParams.get(i));
}
しかし、私は他に何をしたいの文のようなものです
したがって、問題は、レイアウトパラメータtopMarginとleftMarginを計算するのに必要なポイントで、cusViewsの幅がゼロであることにあります。
残念ながら、私が達成したいことに対してRelativeLayoutのルールを使用することはできません。 RelativeLayout.RIGHT_OFやRelativeLayout.BELOWのようなルールを作成する方法があれば、そのようにすることができます。これは可能ですか?
あなたの一般的なアプローチは大丈夫です(relative-layout-or-any-otherは十分ではないことを前提としていますが、非常にまれです)。私の賭けはあなたがsthです。 LayoutParamsを設定するときに間違っていると、この部分は扱いにくく、過去にも同様の問題がありました。いくつかのコードサンプルを提供してください。私たちはできることを見ていきます。 –
私はいくつかの作業コードを追加しました。問題を理解するのに十分であることを願っています。独自のRelativeLayoutルールを作成できるかどうか知っていますか?これらのルールを実際に使用すると問題が解決する可能性があります。 –