2012-04-22 17 views
0

私は、ビューのラッパーのviewTreeObserverに添付されたOnGlobalLayoutListenerを使用して、ビューのラッパーのgetHeight()関数へのコールバックに依存するアクティビティー内のビューにアンドロイド・アプリケーションを作成して、 onCreateの間に動作しなければなりません。通常、これは以下のxmlでchordDisplayによって要求された400ピクセル未満です。これはアンドロイドエミュレータで完璧に動作し、アンドロイド2.1と4.03を使用するさまざまな画面サイズに対応しています。しかし、私のライトでは、向きをポートレートに変えて風景に戻すまで(手動でもコードでも)、アプリケーションをランドスケープで起動すると、コールバックは正しい高さに戻りません(400px未満)。これは、私のビューの内容のサイズが正しくないことを意味します。奇妙な火災の火災のレイアウトの問題

私は当初、風景の中にアプリを起動

サンプルlogcat出力:私はこれが起こっする方法を理解していない

04-22 17:32:44.546: D/onGlobalLayout(12979): chordDisplay.getHeight(): 350 

04-22 17:31:28.249: D/onGlobalLayout(12979): chordDisplay.getHeight(): 400 

は、私が風景に戻っ肖像画に切り替えて、オリエンテーションの変更中に起こるすべてのことが、アプリケーションのonCreate()へのもう1つの呼び出しであると考えています。私がアプリを起動したときと同じことが起こります。

誰もが、アプリの向きの切り替えやレイアウトのバグに似た経験がありますか?/これがどうして起こるのか、考えてください。どんな助けでも高く評価されるでしょう...ありがとう。

コード:

OnGlobalLayoutListener thelistener; 
RelativeLayout chordDisplayWrapper; 
TableRow.LayoutParams lp; 
private ChordAdapter chordAdapter; 
private HorizontalListView chordDisplay 

thelistener = new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       chordDisplayWrapper.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       Log.d("onGlobalLayout", "chordDisplay.getHeight(): " + chordDisplay.getHeight()); 
       lp = new TableRow.LayoutParams(chordDisplay.getHeight()/6 -2,chordDisplay.getHeight()/6 -2); //6 just works. I shrink it a tiny bit to compensate for some weird bug. 
       chordAdapter = (new ChordAdapter(mcontext, R.layout.row, magicbundle, lp)); 
       chordDisplay.setAdapter(chordAdapter); 
      } 
     }; 
     chordDisplayWrapper.getViewTreeObserver().addOnGlobalLayoutListener(thelistener); 
関与ビューの

のxmlレイアウト:

<RelativeLayout 
     android:id="@+id/chordDisplayWrapper" 
     android:layout_width="wrap_content" 
     android:layout_height="0dip" 
     android:layout_weight="1" 
     android:gravity="center" > 

     <berry.chordsfree.HorizontalListView 
      android:id="@+id/testerList" 
      android:layout_width="wrap_content" 
      android:layout_height="400px" 
      android:layout_centerInParent="true" 
      android:gravity="center" /> 
    </RelativeLayout> 

答えて

1

あなたは今ではこれを解決したが、後に本に遭遇する可能性があるもののために後世のために掲載している可能性があり -

私はNexus Oneでカスタム2.3.7 ROMを実行しているのと同じ問題を抱えていますが、このコードはNexus Galaxyの在庫4.1.1上で動作します。

onCreateの間に特定のビューのサイズを変更しようとしています。ViewTreeObserverを使用しています。私は手動でdispatchGlobalLayoutに電話をかけてみましたが、発砲していないということは問題ではないことを確認しました。onGlobalLayoutそして、私は動きのある要素をアクティビティのonWindowFocusChangedに渡して成功させました(しかし、私はそこで多くのサイズ変更をしないようにしたいと思います)。これは私の仕事の1日以上を要したので、私はちょうど今すぐクイック/ダーティな修正を使用しています。 onCreateが終了した後で、問題のレイアウト/ビューを微調整するだけで正常に表示されます。

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 

    if (!reset) { 

     LinearLayout frameItem = (LinearLayout) findViewById(R.id.frameItem); 
     frameItem.setVisibility(LinearLayout.GONE); 
     frameItem.setVisibility(LinearLayout.VISIBLE); 
     reset = true; 
    } 
}