2012-02-10 7 views
3

RelativeLayoutにstuffを追加するときに、どのようなシーケンスが呼び出されているのか少し問題があります。私は、RelativeLayoutを作成し、そのRelativeLayoutにいくつかのカスタムビュー(名前はcusView)を入れたいところで、Activity(名前はRelActivity)というクラスを拡張しています。カスタムビューのtopMarginとleftMarginは、別のカスタムViewの位置を使用して計算されます(つまり、最初のカスタムViewは、数値をtopMarginとleftMarginに設定して直接配置する必要があります)。この場合、RelativeLayoutのルールでは不十分であることに注意してください。Androidビューの幅はいつ設定されますか?

だから、問題になる。私のRelActivityで私はこれを実行します。

  1. がcusViewsとカーソルが最初cusViewのためのデータベース
  2. から受け取っRelativeLayout(名前、それrelLayout)
  3. 反復を作成する - > TOPMARGINとLEFTMARGINによって設定された位置を使用してLayoutParameter
  4. 他cusViewsの場合 - >他のcusViewsのいずれかを使用して、TOPMARGINとLEFTMARGINを計算し、LayoutParameter
  5. 設定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のようなルールを作成する方法があれば、そのようにすることができます。これは可能ですか?

+0

あなたの一般的なアプローチは大丈夫です(relative-layout-or-any-otherは十分ではないことを前提としていますが、非常にまれです)。私の賭けはあなたがsthです。 LayoutParamsを設定するときに間違っていると、この部分は扱いにくく、過去にも同様の問題がありました。いくつかのコードサンプルを提供してください。私たちはできることを見ていきます。 –

+0

私はいくつかの作業コードを追加しました。問題を理解するのに十分であることを願っています。独自のRelativeLayoutルールを作成できるかどうか知っていますか?これらのルールを実際に使用すると問題が解決する可能性があります。 –

答えて

1

このレイアウトの目標はあまり明確ではありません。シンプルなLinearLayoutを使用して、必要なものを得ることは可能でしょう。あなたのサイズにしたい場合は

データベース検索からこれらはその後戻って、その後、単純に、addView()最初を使用して、各ビューを追加し、それぞれへの参照を格納しようとすると、適切にそれらを配置するためにマージンを敷石ポジション。

+0

注:絶対ビュー_アプローチを_relative_ビューに強制しようとしています。最終的なレイアウトがどのように表示されるべきかについて目標を共有する場合、おそらくこれを行うためのより良い方法があります。 – PaulP

+0

私はこれを調べて、LinearLayoutが行く方法だと考えています。あなたが言うように、私は絶対的な見方を相対的視野から強制しようとしています。別の方法として、GridLayoutを使用することができますが、私はこれを自分で試していません。 –

関連する問題