何も操作アンドロイドユーザーを監視しない方法

公式は私たちにそのようなAPIを与えていない、すべてが自分でそれをしたい論理的です!
私はそう思う:
ユーザーが何も操作が実際に、ユーザーを編集しないされていない画面上でクリックするか、摩擦(移動)しないでください。
クリックすると、摩擦時間がAPIのアクティビティを使用しているモニターが、特にそれ、このポップ・ダイアログとpopuWindowなどのクリックして、摩擦が活動チューブによって所有されていません。
ある場合しかし、需要のポップアップは、ユーザーが操作しているように見えます。だから、2つの方法があります。

1. 基本クラス管理方法:カスタムベースクラスBaseDialogダイアログから継承された、または基本クラスBasePopuWindow PopuWindowから継承され、その後表示を(上書きする)(popuWindowがshowAtLocation()またはshowAsDropDown(ある場合))及び()メソッドを閉じ、内部に独自のブール値の識別子を追加します。次にダイアログ項目と基本クラスに対応する全てのpopuWindowの全てを継承することができます。

2. 活動フォーカス管理方法:この方法は、ベースクラスのBaseActivity活性を記述する必要があり、オーバーライドメソッド

 @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        //activity发生焦点变化监听
        Log.e(TAG, "onWindowFocusChanged: activity焦点变化=="+hasFocus );
    }

アプリケーション内のすべての活動はBaseActivityを継承しています。
このonWindowFocusChanged(ブールhasFocus)方法でリガ自分が与えられたブール・フラグ、活動の焦点は、ポップを奪われたかどうかを決定するためのフラグとしてこれを取るのいずれかの後。アプリケーションならばバックグラウンドにポップやポップかどうかを決定するために。

私は第二の方法、地方のものを使用して...

だから、ポップの不存在下で、ユーザーがアクティビティまたはアクティビティ摩擦それをクリックするかどうかを監視?
<ウィンドウによってコールバック!>
ウィンドウの次のカスタムコールバック:

public class WinCallback implements Window.Callback {
    Window.Callback callback;

    public WinCallback(Window.Callback callback) {
        this.callback = callback;
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        return callback.dispatchKeyEvent(event);
    }

    @Override
    public boolean dispatchKeyShortcutEvent(KeyEvent event) {
        return callback.dispatchKeyShortcutEvent(event);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        return callback.dispatchTouchEvent(event);
    }

    @Override
    public boolean dispatchTrackballEvent(MotionEvent event) {
        return callback.dispatchTrackballEvent(event);
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
    @Override
    public boolean dispatchGenericMotionEvent(MotionEvent event) {
        return callback.dispatchGenericMotionEvent(event);
    }

    @Override
    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
        return callback.dispatchPopulateAccessibilityEvent(event);

    }

    @Override
    public View onCreatePanelView(int featureId) {
        return callback.onCreatePanelView(featureId);
    }

    @Override
    public boolean onCreatePanelMenu(int featureId, Menu menu) {
        return callback.onCreatePanelMenu(featureId, menu);
    }

    @Override
    public boolean onPreparePanel(int featureId, View view, Menu menu) {
        return callback.onPreparePanel(featureId, view, menu);
    }

    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {
        return callback.onMenuOpened(featureId, menu);
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        return callback.onMenuItemSelected(featureId, item);
    }

    @Override
    public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) {
        callback.onWindowAttributesChanged(attrs);
    }

    @Override
    public void onContentChanged() {
        callback.onContentChanged();
    }

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

    @Override
    public void onAttachedToWindow() {
        callback.onAttachedToWindow();
    }

    @Override
    public void onDetachedFromWindow() {
        callback.onDetachedFromWindow();
    }

    @Override
    public void onPanelClosed(int featureId, Menu menu) {
        callback.onPanelClosed(featureId, menu);
    }

    @Override
    public boolean onSearchRequested() {
        return callback.onSearchRequested();
    }

    @Override
    public boolean onSearchRequested(SearchEvent searchEvent) {
        return false;
    }

    @Override
    public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {
        return this.callback.onWindowStartingActionMode(callback);
    }

    @Nullable
    @Override
    public ActionMode onWindowStartingActionMode(ActionMode.Callback callback, int type) {
        return null;
    }

    @Override
    public void onActionModeStarted(ActionMode mode) {
        callback.onActionModeStarted(mode);
    }

    @Override
    public void onActionModeFinished(ActionMode mode) {
        callback.onActionModeFinished(mode);
    }
}

どのようにそれを使用するには?
見てみましょう:

Activity activity = ContextBean.getInstance().getActivity();
 if (activity == null) { return; }
 Window win = activity.getWindow();
        Log.e(TAG, "touchOnclick: activity="+activity );
        win.setCallback(new WinCallback(win.getCallback()) {
            @Override
            public boolean dispatchTouchEvent(MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_MOVE:
                        Log.e(TAG, "dispatchTouchEvent:activity窗口被触摸");
                        break;
                    case MotionEvent.ACTION_UP:
                       Log.e(TAG, "dispatchTouchEvent:手指离开activity窗口");
                        break;
                }
                return super.dispatchTouchEvent(event);
            }
        });

ContextBean.getInstance()。GetActivity()は、現在の世界的な買収活動の最後の記事が実証されています。

別の場合では、この制御は、それがタッチモニターチューブを超えて所有されていない場合に編集することがEDITTEXTあります。
プロジェクト全体はあまりのEditText、リスナーを書くための合計ではなく、それはまだカスタムベースクラスを書くの考え方と基本クラスの管理はMyEditText AppCompatEditTextから継承されます。

public class MyEditText extends AppCompatEditText {
    private static final String TAG = "MyEditText";
    public MyEditText(Context context) {
        super(context);
        setOnFocusChangeListener(listener);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOnFocusChangeListener(listener);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setOnFocusChangeListener(listener);
    }

    OnFocusChangeListener listener = new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            //是否在编辑editText,editText被销毁时不调用这个,调用onDetachedFromWindow()
    			 Log.e(TAG, "EditText是否被编辑=="+hasFocus);
        }
    };

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        Log.e(TAG, "EditText被销毁==");
    }
}

同様に、ここであなたは、ユーザーが基礎を編集しているかどうかを判断するように、ブール値のフラグを追加することができます。
そして、全ての使用のEditTextレイアウトファイルでプロジェクト全体、すべての「<のEditText」に「アプリのパッケージ名<.MyEditText」することができます。

おすすめ

転載: blog.csdn.net/weixin_43115440/article/details/89959418