2012-01-22 7 views
4

大丈夫ここに私の問題は、画面の下部にある2つのボタンのセットに塗りつぶすスクロールビューを作成したいと思います。知っている私はちょうど私が行くだろうと私は親指を埋めるためにスクロールビューの高さを取得し、ボタンを使用してリニアレイアウトの高さを取得するスクロールビューを設定することはできません知っている。次に他のものから1つを引いてから、スクロールビューの高さをリセットします。私はスクロールビューの高さを取得して設定する方法を考え出しました。私はそれが活動の他のビューのすべてを測定する方法を見つけましたが、この1つでは、常にゼロを返し、私はその高さを得る方法を失いました。ボタンを使ってビューの高さをプログラムで取得する方法は?

final LinearLayout tv = (LinearLayout)findViewById(R.id.thebuttons); 
    ViewTreeObserver vto = tv.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 
      Integer grr = tv.getHeight(); 
      Log.e("the h", grr.toString()); 
      ViewTreeObserver obs = tv.getViewTreeObserver(); 
      obs.removeGlobalOnLayoutListener(this); 
     } 
    }); 

私はこれを私の他のレイアウトに設定すると、予想通りに高さを得ることができますが、これを0に設定します。これが私が測定しようとしているものです!私はまた、ウィジェットは、彼らが作成されません画面に表示されない場合、私は最終的に自分自身 をそれを考え出し無駄

<LinearLayout 
android:id="@+id/thebuttons" 
android:orientation="horizontal" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="center_horizontal" 
android:layout_marginTop="5sp" 
> 
<Button 
    android:id="@+id/saveit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Save" /> 
<Button 
    android:id="@+id/clearit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Save" /> 
</LinearLayout> 
+0

ただ、[使用するのと同じ問題と戦っ役立ちます

private void sizeit(Integer thebuttons) { View v = findViewById(R.id.viewmain); int total = v.getHeight(); v = findViewById(R.id.view1); ViewGroup.MarginLayoutParams vlp = (MarginLayoutParams) v.getLayoutParams(); int used=v.getHeight()+vlp.topMargin; v = findViewById(R.id.view2); vlp = (MarginLayoutParams) v.getLayoutParams(); used+=v.getHeight()+vlp.topMargin; v = findViewById(R.id.fonttext); vlp = (MarginLayoutParams) v.getLayoutParams(); used+=v.getHeight()+vlp.topMargin; v = findViewById(R.id.infolabel); vlp = (MarginLayoutParams) v.getLayoutParams(); used+=v.getHeight()+vlp.topMargin; Integer scrsize=total-used-thebuttons; v = findViewById(R.id.scrview); ScrollView scr = (ScrollView)findViewById(R.id.scrview); ViewGroup.LayoutParams scrlprams = scr.getLayoutParams(); scrlprams.height=scrsize; scr.setLayoutParams(scrlprams); } 

希望:私の上で

はこれを得た私の方法を作ります'LinearLayout'の代わりに 'RelativeLayout'](http://developer.android.com/resources/tutorials/views/hello-relativelayout.html)を使用すると、必要のない方法で要素を簡単に配置することができます任意の不快な測定など – tomtheguvnor

答えて

12

に直接ボタンを測定しようとしました。ボタン要素はまだレンダリングされていないのでゼロになります。スクロールビューがスクリーンからそれらを押し出したためにレンダリングされたことがない場所です。 私はこの問題をさまざまな角度から攻撃しました。今回は、スクロールビューを任意の小数点に設定してボタンを画面上に置いて、トップレベルレイアウトのサイズを「int totalsize」にしてからスクロールビューを除くすべての要素のサイズを取得し、各ビューの余白を取得して、それらをすべて「int used」に集計した後、スクロールビューの高さを「totalsize-used」に設定しています。画面サイズが変わったときに動作しないマージンを手作業で集計したので、マージンも変更されているため、ビューサイズとともに最もよく検出されます。

final Button tv = (Button)findViewById(R.id.saveit); 
    ViewTreeObserver vto = tv.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 
      ViewGroup.MarginLayoutParams vlp = (MarginLayoutParams) tv.getLayoutParams(); 
      int btnsize =tv.getMeasuredHeight()+vlp.topMargin; 
      sizeit(btnsize); 
      ViewTreeObserver obs = tv.getViewTreeObserver(); 
      obs.removeGlobalOnLayoutListener(this); 
     } 
    }); 

、その後、サイズのIT機能、これは誰も