Dianne Hackbornは、レイアウトがサイズ変更されたとき、たとえばソフトキーボードが開いたり閉じたりしたときに検出できるいくつかのスレッドで言及しました。そのようなスレッドはこれです... http://groups.google.com/group/Android-developers/browse_thread/thread/d318901586313204/2b2c2c7d4bb04e1b
しかし、私は彼女の答えを理解しませんでした:「対応するすべてのレイアウトトラバーサルとコールバックでビュー階層のサイズが変更されたため。」
誰かがこれを検出する方法の詳細な説明またはいくつかの例を持っていますか?これを検出するためにどのコールバックにリンクできますか?
ありがとう
onSizeChanged を上書き View !
1つの方法はビューです。 addOnLayoutChangeListener 。この場合、ビューをサブクラス化する必要はありません。ただし、APIレベル11は必要です。また、境界からのサイズの正しい計算(APIに文書化されていない)は、落とし穴になることがあります。これが正しい例です:
view.addOnLayoutChangeListener( new View.OnLayoutChangeListener()
{
public void onLayoutChange( View v,
int left, int top, int right, int bottom,
int leftWas, int topWas, int rightWas, int bottomWas )
{
int widthWas = rightWas - leftWas; // Right exclusive, left inclusive
if( v.getWidth() != widthWas )
{
// Width has changed
}
int heightWas = bottomWas - topWas; // Bottom exclusive, top inclusive
if( v.getHeight() != heightWas )
{
// Height has changed
}
}
});
(dacweが回答する)別の方法は、ビューをサブクラス化して onSizeChanged をオーバーライドすることです。
私の解決策は、レイアウト/フラグメントの最後に非表示の小さなダムビューを追加する(または背景として追加する)ことです。したがって、レイアウトのサイズを変更すると、そのビューのレイアウト変更イベントがトリガーされ、追いつくことができますOnLayoutChangeListenerによる:
レイアウトの最後にダムビューを追加する例:
<View
Android:id="@+id/theDumbViewId"
Android:layout_width="1dp"
Android:layout_height="1dp"
/>
イベントを聞く:
View dumbView = mainView.findViewById(R.id.theDumbViewId);
dumbView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
// Your code about size changed
}
});
https://stackoverflow.com/users/2402790/michael-allan に感謝します。これは、すべてのビューを上書きしたくない場合に適したシンプルな方法です。 APIが進化したので、代わりにこのコピーペーストをお勧めします。
String TAG="toto";
///and last listen for size changed
YourView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v,
int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
boolean widthChanged=((right-left)!=(oldRight-oldLeft));
if( widthChanged )
{
// width has changed
Log.e(TAG,"Width has changed new width is "+(right-left)+"px");
}
boolean heightChanged=((bottom-top)!=(oldBottom-oldTop));
if( heightChanged)
{
// height has changed
Log.e(TAG,"height has changed new height is "+(bottom-top)+"px");
}
}
});