しばらくの間にダイアログフレグメントとログアウトでユーザーの非アクティブを検出する -- android フィールド と android-fragments フィールド と android-fragmentactivity フィールド と android-dialogfragment フィールド と fragmentmanager フィールド 関連 問題

Detect user inactivity in DialogFragment and logout after some time












3
vote

問題

日本語

私のアプリには多くのアクティビティとダイアログフラグメントがあります。アクティビティの検出について検索し、 onUserInterAction 関数について知ってきましたが、ダイアログの断片が開いている間だけではありませんがアクティビティのみで検出しませんでした。

英語

There are many activities and dialog fragments in my app. I searched about detecting activity and came to know about onUserInterAction function but it detects in activity for activities only but not while a dialog fragment is open.

</div
              
 
 

回答リスト

1
 
vote
vote
ベストアンサー
 

ダイアログのウィンドウコールバックにラッパーを作成することでこれを解決しました。

yourdialogfragment.java

<事前> <コード> @Override public void onStart() { super.onStart(); UserInteractionInterceptor.wrapWindowCallback(getDialog().getWindow(), getActivity()); }

UserInteractionInterceptor.java

<事前> <コード> public class UserInteractionInterceptor { public static void wrapWindowCallback(Window window, FragmentActivity activity) { Window.Callback originalCallback = window.getCallback(); window.setCallback(new Window.Callback() { @Override public boolean dispatchKeyEvent(KeyEvent event) { return originalCallback.dispatchKeyEvent(event); } @Override public boolean dispatchKeyShortcutEvent(KeyEvent event) { return originalCallback.dispatchKeyShortcutEvent(event); } //This is the important override @Override public boolean dispatchTouchEvent(MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN) { if(activity != null) activity.onUserInteraction(); } return originalCallback.dispatchTouchEvent(event); } @Override public boolean dispatchTrackballEvent(MotionEvent event) { return originalCallback.dispatchTrackballEvent(event); } @Override public boolean dispatchGenericMotionEvent(MotionEvent event) { return originalCallback.dispatchGenericMotionEvent(event); } @Override public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { return originalCallback.dispatchPopulateAccessibilityEvent(event); } @Nullable @Override public View onCreatePanelView(int featureId) { return originalCallback.onCreatePanelView(featureId); } @Override public boolean onCreatePanelMenu(int featureId, Menu menu) { return originalCallback.onCreatePanelMenu(featureId, menu); } @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { return originalCallback.onPreparePanel(featureId, view, menu); } @Override public boolean onMenuOpened(int featureId, Menu menu) { return originalCallback.onMenuOpened(featureId, menu); } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { return originalCallback.onMenuItemSelected(featureId, item); } @Override public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) { originalCallback.onWindowAttributesChanged(attrs); } @Override public void onContentChanged() { originalCallback.onContentChanged(); } @Override public void onWindowFocusChanged(boolean hasFocus) { originalCallback.onWindowFocusChanged(hasFocus); } @Override public void onAttachedToWindow() { originalCallback.onAttachedToWindow(); } @Override public void onDetachedFromWindow() { originalCallback.onDetachedFromWindow(); } @Override public void onPanelClosed(int featureId, Menu menu) { originalCallback.onPanelClosed(featureId, menu); } @Override public boolean onSearchRequested() { return originalCallback.onSearchRequested(); } @TargetApi(Build.VERSION_CODES.M) @Override public boolean onSearchRequested(SearchEvent searchEvent) { return originalCallback.onSearchRequested(searchEvent); } @Nullable @Override public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) { return originalCallback.onWindowStartingActionMode(callback); } @TargetApi(Build.VERSION_CODES.M) @Nullable @Override public ActionMode onWindowStartingActionMode(ActionMode.Callback callback, int type) { return originalCallback.onWindowStartingActionMode(callback, type); } @Override public void onActionModeStarted(ActionMode mode) { originalCallback.onActionModeStarted(mode); } @Override public void onActionModeFinished(ActionMode mode) { originalCallback.onActionModeFinished(mode); } }); }

}

 

I solved this by creating a wrapper on the dialog's Window callback.

YourDialogFragment.java

@Override public void onStart() {     super.onStart();     UserInteractionInterceptor.wrapWindowCallback(getDialog().getWindow(), getActivity()); } 

UserInteractionInterceptor.java

public class UserInteractionInterceptor {  public static void wrapWindowCallback(Window window, FragmentActivity activity) {     Window.Callback originalCallback = window.getCallback();      window.setCallback(new Window.Callback() {         @Override         public boolean dispatchKeyEvent(KeyEvent event) {             return originalCallback.dispatchKeyEvent(event);         }          @Override         public boolean dispatchKeyShortcutEvent(KeyEvent event) {             return originalCallback.dispatchKeyShortcutEvent(event);         }         //This is the important override         @Override         public boolean dispatchTouchEvent(MotionEvent event) {             if(event.getAction() == MotionEvent.ACTION_DOWN) {                 if(activity != null)                     activity.onUserInteraction();             }             return originalCallback.dispatchTouchEvent(event);         }          @Override         public boolean dispatchTrackballEvent(MotionEvent event) {             return originalCallback.dispatchTrackballEvent(event);         }          @Override         public boolean dispatchGenericMotionEvent(MotionEvent event) {             return originalCallback.dispatchGenericMotionEvent(event);         }          @Override         public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {             return originalCallback.dispatchPopulateAccessibilityEvent(event);         }          @Nullable         @Override         public View onCreatePanelView(int featureId) {             return originalCallback.onCreatePanelView(featureId);         }          @Override         public boolean onCreatePanelMenu(int featureId, Menu menu) {             return originalCallback.onCreatePanelMenu(featureId, menu);         }          @Override         public boolean onPreparePanel(int featureId, View view, Menu menu) {             return originalCallback.onPreparePanel(featureId, view, menu);         }          @Override         public boolean onMenuOpened(int featureId, Menu menu) {             return originalCallback.onMenuOpened(featureId, menu);         }          @Override         public boolean onMenuItemSelected(int featureId, MenuItem item) {             return originalCallback.onMenuItemSelected(featureId, item);         }          @Override         public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) {             originalCallback.onWindowAttributesChanged(attrs);         }          @Override         public void onContentChanged() {             originalCallback.onContentChanged();         }          @Override         public void onWindowFocusChanged(boolean hasFocus) {             originalCallback.onWindowFocusChanged(hasFocus);         }          @Override         public void onAttachedToWindow() {             originalCallback.onAttachedToWindow();         }          @Override         public void onDetachedFromWindow() {             originalCallback.onDetachedFromWindow();         }          @Override         public void onPanelClosed(int featureId, Menu menu) {             originalCallback.onPanelClosed(featureId, menu);         }          @Override         public boolean onSearchRequested() {             return originalCallback.onSearchRequested();         }          @TargetApi(Build.VERSION_CODES.M)         @Override         public boolean onSearchRequested(SearchEvent searchEvent) {             return originalCallback.onSearchRequested(searchEvent);         }          @Nullable         @Override         public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {             return originalCallback.onWindowStartingActionMode(callback);         }          @TargetApi(Build.VERSION_CODES.M)         @Nullable         @Override         public ActionMode onWindowStartingActionMode(ActionMode.Callback callback, int type) {             return originalCallback.onWindowStartingActionMode(callback, type);         }          @Override         public void onActionModeStarted(ActionMode mode) {             originalCallback.onActionModeStarted(mode);         }          @Override         public void onActionModeFinished(ActionMode mode) {             originalCallback.onActionModeFinished(mode);         }     }); } 

}

</div
 
 

関連する質問

0  FragmentStatePageApterとViewPagerを持つ複数のタブ  ( Multiple tabs with fragmentstatepageadapter and viewpager ) 
良い午後、私はタブレイアウトを使用して4つのフラグメントを含むアクティビティを持っています、たとえば2つのフラグメントのみが初期化されたときに、たとえば最初のフラグメントに初期化されます。 2をスライドさせる3分の1を初期化し、次に2と3が初期化され、最初のも...

0  ボトムシートダイアログフラグメントからフラグメントを開く - Android Studio Java  ( Opening a fragment from a bottomsheetdialogfragment android studio java ) 
下部シートからフラグメントを開こうとしていますが、アプリを実行して、これを行うのに想定されている下部シートのボタンをクリックすると、アプリはクラッシュします。 表示されたビルド障害は次のとおりです。 このビルドで廃止予定された卒業生の機能が使用されています。...

23  (子供)FragmentManagerとサブサブフラグメントの適切な使用  ( Proper use of sub sub fragments with childfragmentmanager ) 
私はきちんとフラグメントにフラグメントを使用する方法を教えてください。 私は(簡体字)ユースケースには、次のされ、... すべての断片が両親に手動で追加されている...私は、レイアウトフラグメントとの活性を有し、このフラグメントはtheirselfは、サブフラ...

0  フラグメントとバックステージは時々めちゃくちゃになる  ( Fragments and backstage sometimes get messed up ) 
フラグメントやナビゲーションレーガのコンテナでアクティビティがあります。引き出し内の項目を選択すると、 updatePage(index) 。 私はアクティビティと savedInstanceState == null をinit My Activityに作成...

7  OnAttach、OnCreate、OnCreateViewなどを呼び出しないアクティビティ内のフラグメントを置き換える  ( Replacing fragments in an activity not calling onattach oncreate oncreateview ) 
だから私はここでこのコードを持っています、私は新しいフラグメントを作成し、それを別の断片に置き換えています。それはうまく機能します。ただし、最初の行にコンストラクタが呼び出されていますが、<コード> 03-11 14:19:51.171: D/GameView...

2  非アクティビティクラスでGetSupportFragmentManagerへのアクセスを取得します  ( Get access to getsupportfragmentmanager in non activity class ) 
誰かが助けることができることを願っています。 私は static メソッドでFragmentManagerにアクセスする必要がある非アクティビティクラスを持っています、私はコンテキストを正しく渡す方法を知っていません。 任意の助けが高く、 非アクティビティクラ...

-1  getFragmentManager()内のクラスの中  ( Getfragmentmanager inside class ) 
私のダイアログフレグメントを表示するには、クラス内でGetFragmentManagerをgetfragmentManagerにしようとしていますが、それがエラーをスローします...: java.lang.ClasscastException:exampl...

1  アクティビティにオンバッキングがマッグラグメントを持っている場合、java.lang.NullPointerExceptionが取得されます  ( I get java lang nullpointerexception when onbackpressed in activity have a mapfr ) 
私のカスタムフラグメントからGoogleMapを表示するためのアクティビティがあります。すべてのものが正しく表示されますが、このアクティビティから戻るボタンをクリックすると、Androidエラーアラートメッセージと 'java.lang.Runtimeexce...

2  fragment - IDがユニークでない場合は、コンテナを置き換えます。  ( Fragment replace container if id is not unique ) 
私は同じIDを持つ2つのビューを持つレイアウトを持っています。ビューを見つけたい場合は、 parentView1.findViewById(R.id.content) または<コード> parentView2.findViewById(R.id.content...

0  ViewPager、現在のページをビューページに含まれていない別のページに切り替える方法は、Tableayoutを一番下に保つ  ( Viewpager how to switch the current page to another page which is not included ) 
最初に、私の曖昧なタイトルですみません、 私は本当に私が満たす問題を説明する方法がわからない。 私は説明するために写真を描こうとします。 次の図では、 tableayout が最初のページを指している viewpager があります。 だからそれは...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有