6

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

リサイズ後のレイアウト

問題は、HierarchyViewer でアクティビティを調べると、必要に応じてレイアウトが表示されることです。

階層ビューア後のレイアウト

私の推測では、 HierarchyViewer はビューで requestLayout() または invalidate() を呼び出しますが、試してみましたが成功しませんでした。このコードは、メイン アクティビティで呼び出されても効果はありません。

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

サイズ変更後にビューを無効にすることも試みました。

TextView の重力は中央に設定されており、サイズ変更が行われなければ問題ないように見えます。

どんなヒントでも大歓迎です、事前に感謝します!

4

3 に答える 3

2

TextView の親の 1 つで onLayout をオーバーライドし、コンストラクターで作成された Handler を使用して解決しました

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);
  }

TextView の onLayout 内で requestLayout を呼び出そうとしましたが、機能しませんでした。理由はわかりません。Observer を介して値が更新されたことが原因である可能性がありますが、onTextChanged リスナーは UI スレッドで発生するはずです。それが他の誰かに役立つことを願っています

于 2012-10-15T19:58:05.773 に答える
2

requestLayout()ビューで呼び出されると、ビュー自体とそのすべての子にレイアウト パスがスケジュールされます。これは、マージン、パディング、またはコンテンツの変更のために、ビューが移動またはサイズ変更された場合に望ましいものです。

メソッドに関するドキュメントは、getDecorView()正確に何が得られるかについてあまり明確ではありません。ただし、Web サイトのドキュメントによると、次のようになります。

setContentView(View, android.view.ViewGroup.LayoutParams) で説明されているように、この関数を初めて呼び出すと、さまざまなウィンドウの特性が「固定」されることに注意してください。

getDecorView()これにより、取得するビューには特別な何かがあると私は信じています。あなたがおそらく行っていることは、ビューのレイアウトを永続的なものにして、requestLayout()パスを作成しても変更されないようにすることです。

これは明らかに、アクティビティ全体のルート ビューを取得する適切な方法です。

ただし、効率的な理由から、requestLayout()可能な限り最下位の子を呼び出すことをお勧めします。前に言ったように、ビューにレイアウト パスをスケジュールし、それは子です。最上位のビューでレイアウト パスを実行すると、基本的に、そのままのビューを含むすべてを再構築することになります。

于 2012-10-16T12:08:18.013 に答える
0

hereで説明されているように、おそらくrunOnUiThreadを使用して UI スレッドでタイマー コードを実行する必要があります。

于 2012-10-15T13:50:29.100 に答える