公式は私たちにそのような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」することができます。