0

Runnableステータスバーの高さを見つけていましたが、正しい出力が得られました。

しかし、のメソッドの外でStatusBarHeightにアクセスするにはどうすればよいですか?run()Runnable

これが私のコードです:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final RelativeLayout main = (RelativeLayout) findViewById(R.id.main);

        final Rect rectgle = new Rect();
        final Window window = getWindow();

        main.post(new Runnable() {
            @Override
            public void run() {

                window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
                int StatusBarHeight = rectgle.top;
                int contentViewTop = window.findViewById(
                        Window.ID_ANDROID_CONTENT).getTop();
                int TitleBarHeight = contentViewTop - StatusBarHeight;

                Log.i("ScreenDemo", "StatusBar Height= " + StatusBarHeight
                        + " , TitleBar Height = " + TitleBarHeight);
            }
        });
}

PS : でコードをrun()直接記述すると、 UI がまだレンダリングされていないため、0onCreate()が返されます。 どんな助けでも感謝します。

4

2 に答える 2

3

変数StatusBarHeightのスコープは内のブロックに対してローカルです。onCreate()メソッドからアクセスする場合は、次のように宣言する必要があります。

private static int StatusBarHeight;  // class level declaration

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final RelativeLayout main = (RelativeLayout) findViewById(R.id.main);

        final Rect rectgle = new Rect();
        final Window window = getWindow();

        main.post(new Runnable() {
            @Override
            public void run() {

                window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
                StatusBarHeight = rectgle.top;
                int contentViewTop = window.findViewById(
                        Window.ID_ANDROID_CONTENT).getTop();
                int TitleBarHeight = contentViewTop - StatusBarHeight;

                Log.i("ScreenDemo", "StatusBar Height= " + StatusBarHeight
                        + " , TitleBar Height = " + TitleBarHeight);
            }
        });
}
于 2012-11-16T10:40:06.187 に答える
1

変数をクラスのプライベート メンバー変数として宣言して、Runnable. このような:

private int statusBarHeight; // member variable available to all methods in the class

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);    
    final RelativeLayout main = (RelativeLayout) findViewById(R.id.main);
    final Rect rectgle = new Rect();
    final Window window = getWindow();
    main.post(new Runnable() {
        @Override
        public void run() {
            window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
            statusBarHeight = rectgle.top;
            int contentViewTop = window.findViewById(
                     Window.ID_ANDROID_CONTENT).getTop();
            int titleBarHeight = contentViewTop - statusBarHeight;
            Log.i("ScreenDemo", "StatusBar Height= " + statusBarHeight
                     + " , TitleBar Height = " + titleBarHeight);
        }
    });
}

注: 変数の名前を からStatusBarHeightstatusBarHeight、 からTitleBarHeightに変更しましたtitleBarHeight。変数の最初の名前は小文字にすることを忘れないでください。Java の命名規則では、変数名の最初は小文字、クラス名の最初は大文字を使用します。

于 2012-11-16T11:37:45.910 に答える