0

シークバーの進行状況に基づいてボタンの高さを動的に変更しています。

次に、ボタンの高さを取得したいと思います。だから私はの方法で使用btn1.getHeight()しました。 しかし、ボタンの高さの誤った/古い値のセットを提供します。onProgressChanged()SeekBar

代わりに、で使用btn1.getHeight()した場合onStopTrackingTouch()、正しい値が得られます。

これは単純に、 でボタンの高さを取得しようとするとonProgressChanged()、UI の変更が画面に表示されますが、登録されていないため、正しくない/古い値が取得されることを意味します。

で正しい値を取得する方法はonProgressChanged()?

これを行う他の方法はありますか?どんな助けでも感謝します。

編集

@Luksprog:次の変更を加えました:

<SeekBar
    android:id="@+id/seekBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="50dp"
    android:maxHeight="9dp"
    android:minHeight="9dp"
    android:padding="10dp"
    android:max="100"
    android:progressDrawable="@drawable/seekbar_progress"
    android:thumb="@drawable/shine_btn" />

<RelativeLayout
    android:id="@+id/Graph01"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:layout_below="@id/seekBar"
    android:layout_marginTop="50dp"
    android:gravity="bottom" >

    <Button
        android:id="@+id/btnGraph01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"                        
        android:layout_alignParentBottom="true"
        android:background="#99f" />

    <com.example.calci.views.MyTextView
        android:id="@+id/tvGraph01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/btnGraph01" />
</RelativeLayout>

<RelativeLayout
    android:id="@+id/Graph02"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:layout_below="@id/seekBar"
android:layout_toRightOf="@id/Graph01"
    android:layout_marginTop="50dp"
    android:gravity="bottom" >

    <Button
        android:id="@+id/btnGraph02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"                        
        android:layout_alignParentBottom="true"
        android:background="#99f" />

    <com.example.calci.views.MyTextView
        android:id="@+id/tvGraph02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/btnGraph02" />
</RelativeLayout>

</RelativeLayout>

そして活動中

RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(20,
            2 * progress * 1);
    lp2.setMargins(55, 0, 0, 0);
    btnGraph01.setLayoutParams(lp2);

RelativeLayout.LayoutParams lp3 = new RelativeLayout.LayoutParams(
            new ViewGroup.MarginLayoutParams(20,
                    RelativeLayout.LayoutParams.WRAP_CONTENT));
    lp3.setMargins(55, 0, 0, 30);
    tvGraph01.setLayoutParams(lp3);
    tvGraph01.setTextSize(6);
    tvGraph01.setGravity(Gravity.CENTER);

しかし、TextView はボタン内に表示されています...なぜそうなのですか?

間違っている場合は訂正してください...

4

1 に答える 1

2

まず、これはあなたの前の質問に関連していると思います。は使用しませんweights。代わりに、 を底に取り付けて使用RelativeLayoutします。このような:ButtonsButtons

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/parent" >

    <SeekBar
        android:id="@+id/sb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" 
        android:max="200"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:background="#99cc00"
        android:text="Button"
        android:onClick="test" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_toRightOf="@id/button1"
        android:background="#0077cc"
        android:text="Button" />

</RelativeLayout>

第二に、目的の高さを取得できない理由がわかりません。上記の私のコードを使用button.getHeight()すると、以前の高さのストアが取得されます (新しい高さは から出るまで保存されないためonProgressChanged)。しかし、実際には次の値を使用して自分でその値を計算しているため、これで新しい高さを取得できなくなることはありません。

progress * 10

コード:

@Override

    public void onProgressChanged(SeekBar seekBar, final int progress,
                        boolean fromUser) {
                    LayoutParams lp = findViewById(R.id.button1).getLayoutParams();
                    lp.width = 50;
                    lp.height = progress * 10;
                    findViewById(R.id.button1).setLayoutParams(lp);
                    Log.e("XZX", "Progress : " + progress + " |Old height : "
                            + findViewById(R.id.button1).getHeight()
                            + "  |New height : " + (progress * 10));
                }

編集:レイアウトファイルが間違っています:

<RelativeLayout
    android:id="@+id/Graph01"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:layout_below="@id/seekBar"
    android:layout_marginTop="50dp" >

    <Button
        android:id="@+id/btnGraph01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"                        
        android:layout_alignParentBottom="true"
        android:background="#99f" />

    <com.example.calci.views.MyTextView
        android:id="@+id/tvGraph01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/btnGraph01" />
</RelativeLayout>

LayoutParamsコードではofを変更する必要はありません。成長/縮小するにつれてtvGraph01に従い、新しいものを何度も作成する代わりに、現在の を取得して変更します。ButtonLayoutParamsButton

RelativeLayout.LayoutParams lp2 = (RelativeLayout.LayoutParams)btnGraph01.getLayoutParams();
lp2.width = 20;
lp2.height = 2 * progress * 1;
lp2.setMargins(55, 0, 0, 0); // <= do you really need the margin? what is its purpose?
btnGraph01.setLayoutParams(lp2);
tvGraph01.setTextSize(6);
于 2012-09-27T06:29:47.507 に答える