web-dev-qa-db-ja.com

レイアウトのサイズ変更を検出するにはどうすればよいですか?

Dianne Hackbornは、レイアウトがサイズ変更されたとき、たとえばソフトキーボードが開いたり閉じたりしたときに検出できるいくつかのスレッドで言及しました。そのようなスレッドはこれです... http://groups.google.com/group/Android-developers/browse_thread/thread/d318901586313204/2b2c2c7d4bb04e1b

しかし、私は彼女の答えを理解しませんでした:「対応するすべてのレイアウトトラバーサルとコールバックでビュー階層のサイズが変更されたため。」

誰かがこれを検出する方法の詳細な説明またはいくつかの例を持っていますか?これを検出するためにどのコールバックにリンクできますか?

ありがとう

34
cottonBallPaws

onSizeChanged を上書き View

56
dacwe

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 をオーバーライドすることです。

56
Michael Allan

私の解決策は、レイアウト/フラグメントの最後に非表示の小さなダムビューを追加する(または背景として追加する)ことです。したがって、レイアウトのサイズを変更すると、そのビューのレイアウト変更イベントがトリガーされ、追いつくことができます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
        }
    });
4
Tony

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