3

新しい外観の Android ADT (Android 開発者ツール) には、以前使用していた古い Hello World テンプレートよりもはるかに進んだ新しいプロジェクト ウィザードがいくつかあり、それらを理解しようとしていますが、非常に難しいと感じています。

フルスクリーン プロジェクト ウィザードを見ています。

enter code hereこのウィザードを使用してプロジェクトを作成すると、ファイル SystemUIHider.java を含むユーティリティ ライブラリが作成されます。

これが質問です。

そうですか:

protected OnVisibilityChangeListener mOnVisibilityChangeListener = sDummyListener;

クラスファイルの下部にあるインターフェイスを呼び出します。

public interface OnVisibilityChangeListener {

        public void onVisibilityChange(boolean visible);
    }

私の質問は:

1)インターフェースを拡張する必要があると思ったので、このコードにはどのような実用的な目的がありますか?

2) OnVisibilityChangeListener がインターフェイスであり、厳密にはクラスではない場合、これはどのように可能ですか?

 private static OnVisibilityChangeListener sDummyListener = new OnVisibilityChangeListener() {
        @Override
        public void onVisibilityChange(boolean visible) {
        }
    };

ありがとう !

package com.example.test2.util;

import android.app.Activity;
import android.os.Build;
import android.view.View;

public abstract class SystemUiHider {
    /**
     * When this flag is set, the
     * {@link android.view.WindowManager.LayoutParams#FLAG_LAYOUT_IN_SCREEN}
     * flag will be set on older devices, making the status bar "float" on top
     * of the activity layout. This is most useful when there are no controls at
     * the top of the activity layout.
     * <p>
     * This flag isn't used on newer devices because the <a
     * href="http://developer.android.com/design/patterns/actionbar.html">action
     * bar</a>, the most important structural element of an Android app, should
     * be visible and not obscured by the system UI.
     */
    public static final int FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES = 0x1;

    /**
     * When this flag is set, {@link #show()} and {@link #hide()} will toggle
     * the visibility of the status bar. If there is a navigation bar, show and
     * hide will toggle low profile mode.
     */
    public static final int FLAG_FULLSCREEN = 0x2;

    /**
     * When this flag is set, {@link #show()} and {@link #hide()} will toggle
     * the visibility of the navigation bar, if it's present on the device and
     * the device allows hiding it. In cases where the navigation bar is present
     * but cannot be hidden, show and hide will toggle low profile mode.
     */
    public static final int FLAG_HIDE_NAVIGATION = FLAG_FULLSCREEN | 0x4;

    /**
     * The activity associated with this UI hider object.
     */
    protected Activity mActivity;

    /**
     * The view on which {@link View#setSystemUiVisibility(int)} will be called.
     */
    protected View mAnchorView;

    /**
     * The current UI hider flags.
     * 
     * @see #FLAG_FULLSCREEN
     * @see #FLAG_HIDE_NAVIGATION
     * @see #FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES
     */
    protected int mFlags;

    /**
     * The current visibility callback.
     */
    protected OnVisibilityChangeListener mOnVisibilityChangeListener = sDummyListener;

    /**
     * Creates and returns an instance of {@link SystemUiHider} that is
     * appropriate for this device. The object will be either a
     * {@link SystemUiHiderBase} or {@link SystemUiHiderHoneycomb} depending on
     * the device.
     * 
     * @param activity The activity whose window's system UI should be
     *            controlled by this class.
     * @param anchorView The view on which
     *            {@link View#setSystemUiVisibility(int)} will be called.
     * @param flags Either 0 or any combination of {@link #FLAG_FULLSCREEN},
     *            {@link #FLAG_HIDE_NAVIGATION}, and
     *            {@link #FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES}.
     */
    public static SystemUiHider getInstance(Activity activity, View anchorView, int flags) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            return new SystemUiHiderHoneycomb(activity, anchorView, flags);
        } else {
            return new SystemUiHiderBase(activity, anchorView, flags);
        }
    }

    protected SystemUiHider(Activity activity, View anchorView, int flags) {
        mActivity = activity;
        mAnchorView = anchorView;
        mFlags = flags;
    }

    /**
     * Sets up the system UI hider. Should be called from
     * {@link Activity#onCreate}.
     */
    public abstract void setup();

    /**
     * Returns whether or not the system UI is visible.
     */
    public abstract boolean isVisible();

    /**
     * Hide the system UI.
     */
    public abstract void hide();

    /**
     * Show the system UI.
     */
    public abstract void show();

    /**
     * Toggle the visibility of the system UI.
     */
    public void toggle() {
        if (isVisible()) {
            hide();
        } else {
            show();
        }
    }

    /**
     * Registers a callback, to be triggered when the system UI visibility
     * changes.
     */
    public void setOnVisibilityChangeListener(OnVisibilityChangeListener listener) {
        if (listener == null) {
            listener = sDummyListener;
        }

        mOnVisibilityChangeListener = listener;
    }

    /**
     * A dummy no-op callback for use when there is no other listener set.
     */
    private static OnVisibilityChangeListener sDummyListener = new OnVisibilityChangeListener() {
        @Override
        public void onVisibilityChange(boolean visible) {
        }
    };

    /**
     * A callback interface used to listen for system UI visibility changes.
     */
    public interface OnVisibilityChangeListener {
        /**
         * Called when the system UI visibility has changed.
         * 
         * @param visible True if the system UI is visible.
         */
        public void onVisibilityChange(boolean visible);
    }
}
4

1 に答える 1

0
private static OnVisibilityChangeListener sDummyListener = new OnVisibilityChangeListener() {
        @Override
        public void onVisibilityChange(boolean visible) {
        // Implementation here.
        }
};

上記のスニペットはOnVisibilityChangeListener、インターフェースで定義された関数の実装を提供することによって実装する匿名クラスを作成してインスタンス化します。

匿名クラスは、再利用されない特定の実装が必要な場合に使用することを目的としています。つまり、1つの場所でのみインスタンス化される場合は、上記のクラスに名前を付ける理由はありません。匿名のクラスを使用するだけです。通常、匿名クラスは、使用場所にインラインでインスタンス化されます。次に例を示します。

protected OnVisibilityChangeListener mOnVisibilityChangeListener = new OnVisibilityChangeListener() {
        @Override
        public void onVisibilityChange(boolean visible) { }
};

または、次のコードスニペットのように、関数の引数として:

something.setOnVisibilityChangeListener(new OnVisibilityChangeListener() {
        @Override
        public void onVisibilityChange(boolean visible) { }
});
于 2013-01-15T00:50:39.757 に答える