2012-10-13 10 views
7

非常に頻繁に変化する値を表示するグリッドを作成しています。このため、コンテンツが変更されたときに自動サイズ変更するTextViewを使用しています(Auto Scale TextView Text to Fit within Bounds)。サイズ変更が行われますが、私はしたいと私はHierarchyViewerレイアウト・ディスプレイを持つ活性を調べる際にビューが正しくリサイズ後のビューのレイアウト

layout after resize

事がある、レイアウトしません。

layout after hierarchyviewer

私の推測では、HierarchyViewerが起動しますrequestLayout()またはビューに()無効、私はいない成功を収めていることを試みたということです。このコードは、メインアクティビティで呼び出され、何の効果もありません。

new Handler().postDelayed(new Runnable() {    
      @Override 
      public void run() { 
       getWindow().getDecorView().requestLayout(); 
       getWindow().getDecorView().invalidate(); 
      } 
      }, 5000); 

また、サイズ変更後にビューを無効にしてみました。

TextViewの重力はCenterに設定されています。サイズ変更が行われない場合は、OKと表示されます。

ヒントは、事前に感謝の意を表します。

+0

デコレーションビューではなく親ビューでレイアウトをリクエストしようとしましたか? – DeeV

+0

デコレーションビューがビューツリーの親ノードではありませんか?ビューのレイアウトをリクエストすると、そのすべての子がレイアウトをリクエストするようになります。とにかく、私はたくさんのことを試してみたが、私はあなたの提案を試してみると、私はそれを試みたと言いたい。 requestLayoutドキュメントをview.Viewで引用すると、 "このビューのレイアウトを無効にしたものが変更されたときにこれを呼び出すと、ビューツリーのレイアウトパスがスケジュールされます。 – Maragues

+0

それはしますが、私はあなたのコードに間違って何かを見ることができません。 requestLayout()は親ビューと子のレイアウトをレイアウトしますが、私は自分のアプリケーションによって直接制御されるビューでのみ呼び出すので、単なる考えです。 – DeeV

答えて

2

私は、私は、それが動作しませんでしたカントー私は、TextViewののonLayout内requestLayout呼び出ししようとしたのTextViewの親の一つにonLayoutオーバーライドし、コンストラクタで

public class CellView extends LinearLayout{ 
    public CellView(Context context) { 
    super(context); 

    mHandler = new Handler(); 

    View.inflate(context, R.layout.cellview, this); 
    } 

@Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    if(changed){ 
     mHandler.post(new Runnable() {   
     @Override 
     public void run() { 
      requestLayout(); 
     } 
     }); 
    } 

    super.onLayout(changed, left, top, right, bottom); 
    } 

を作成したハンドラを使用して、それを解決しました理由は分かりません。 Observerを介して値が更新されたためですが、UIスレッドでonTextChangedリスナーが発生している可能性があります。私はそれが他の人に役立つことを願っています

0

hereのように、runOnUiThreadを使用してUIスレッドでタイマーコードを実行する必要があります。

+0

UIスレッドでHandlerを作成していると仮定すると、彼はUIスレッドで実行されています。 – DeeV

+0

私はこれを後でチェックします(この時点では動作しません)。私は、UIスレッド外からそのコードを実行すると例外が発生すると言いたいのですが、UIスレッドの外にHandlerを作成している可能性があります。 – Maragues

2

ウェイrequestLayout()の方法は、ビューで呼び出されると、それ自身とそのすべての子にレイアウトパスをスケジュールすることです。これは、ビューがマージン、パディング、またはコンテンツの変更にシフトまたはサイズ変更されるたびに望ましいです。

getDecorView()のドキュメントは、正確に何が得られるかについてはあまり明確ではありません。しかし、websiteのドキュメントあたり:

注意setContentView(ビュー、android.view.ViewGroup.LayoutParams)で説明したように、様々なウィンドウ特性「でロック」初めてこの関数を呼び出すこと。

これは、getDecorView()が取得するビューには特別なものがあると私に信じています。あなたがおそらくやっていることは、ビューのレイアウトを永久に変えて、requestLayout()を渡すときに決して変化しないようにすることです。

This is apparently the proper way to get the root view of your entire activity.

しかし、効率上の理由から、私はあなたがおそらくできる最低子にrequestLayout()を呼び出すことをお勧めします。私が前に言ったように、それはビュー上のレイアウト・パスをスケジューリングし、それは子供です。一番上のビューでレイアウト・パスを実行すると、現場に残っているビューを含むすべてのものが必然的に再構築されます。

+0

というアイデアの両方(NarcísとDeeV)のおかげで、あなたの時間と、requestLayoutの素晴らしいリサーチに感謝しています。将来的にユーザーがあなたに投票した場合、私はあなたにそれを授与します – Maragues

関連する問題