Bea*_*ear 5 android dialog dialog-preference
预计onUserInteraction正在为任何用户交互调用.它运作良好PreferenceActivity.但是,当a DialogPreference弹出时,onUserInteraction即使存在用户交互,例如触摸事件,也不再调用.
似乎 DialogPreference并非唯一的情况.无论何时Dialog显示,它都不会报告用户与活动的交互.
但如果我真的需要它,我该怎么办呢.谢谢.
这是 a 的完整解决方案DialogFragment,它onUserInteraction()在触摸时触发 Activity并保留默认回调的行为:
public abstract class BaseDialogFragment extends DialogFragment {
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final Window window = getDialog().getWindow();
if (window != null) {
window.setCallback(new UserInteractionAwareCallback(window.getCallback(), getActivity()));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是回调本身:
public class UserInteractionAwareCallback implements Window.Callback {
private final Window.Callback originalCallback;
private final Activity activity;
public UserInteractionAwareCallback(final Window.Callback originalCallback, final Activity activity) {
this.originalCallback = originalCallback;
this.activity = activity;
}
@Override
public boolean dispatchKeyEvent(final KeyEvent event) {
return originalCallback.dispatchKeyEvent(event);
}
@Override
public boolean dispatchKeyShortcutEvent(final KeyEvent event) {
return originalCallback.dispatchKeyShortcutEvent(event);
}
@Override
public boolean dispatchTouchEvent(final MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
if (activity != null) {
activity.onUserInteraction();
}
break;
default:
}
return originalCallback.dispatchTouchEvent(event);
}
@Override
public boolean dispatchTrackballEvent(final MotionEvent event) {
return originalCallback.dispatchTrackballEvent(event);
}
@Override
public boolean dispatchGenericMotionEvent(final MotionEvent event) {
return originalCallback.dispatchGenericMotionEvent(event);
}
@Override
public boolean dispatchPopulateAccessibilityEvent(final AccessibilityEvent event) {
return originalCallback.dispatchPopulateAccessibilityEvent(event);
}
@Nullable
@Override
public View onCreatePanelView(final int featureId) {
return originalCallback.onCreatePanelView(featureId);
}
@Override
public boolean onCreatePanelMenu(final int featureId, final Menu menu) {
return originalCallback.onCreatePanelMenu(featureId, menu);
}
@Override
public boolean onPreparePanel(final int featureId, final View view, final Menu menu) {
return originalCallback.onPreparePanel(featureId, view, menu);
}
@Override
public boolean onMenuOpened(final int featureId, final Menu menu) {
return originalCallback.onMenuOpened(featureId, menu);
}
@Override
public boolean onMenuItemSelected(final int featureId, final MenuItem item) {
return originalCallback.onMenuItemSelected(featureId, item);
}
@Override
public void onWindowAttributesChanged(final WindowManager.LayoutParams attrs) {
originalCallback.onWindowAttributesChanged(attrs);
}
@Override
public void onContentChanged() {
originalCallback.onContentChanged();
}
@Override
public void onWindowFocusChanged(final boolean hasFocus) {
originalCallback.onWindowFocusChanged(hasFocus);
}
@Override
public void onAttachedToWindow() {
originalCallback.onAttachedToWindow();
}
@Override
public void onDetachedFromWindow() {
originalCallback.onDetachedFromWindow();
}
@Override
public void onPanelClosed(final int featureId, final Menu menu) {
originalCallback.onPanelClosed(featureId, menu);
}
@Override
public boolean onSearchRequested() {
return originalCallback.onSearchRequested();
}
@TargetApi(Build.VERSION_CODES.M)
@Override
public boolean onSearchRequested(final SearchEvent searchEvent) {
return originalCallback.onSearchRequested(searchEvent);
}
@Nullable
@Override
public ActionMode onWindowStartingActionMode(final ActionMode.Callback callback) {
return originalCallback.onWindowStartingActionMode(callback);
}
@TargetApi(Build.VERSION_CODES.M)
@Nullable
@Override
public ActionMode onWindowStartingActionMode(final ActionMode.Callback callback, final int type) {
return originalCallback.onWindowStartingActionMode(callback, type);
}
@Override
public void onActionModeStarted(final ActionMode mode) {
originalCallback.onActionModeStarted(mode);
}
@Override
public void onActionModeFinished(final ActionMode mode) {
originalCallback.onActionModeFinished(mode);
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,onUserInteraction()当用户与对话框进行交互时,根本不会调用Activity它(甚至从您正在监视交互的开始).
我知道的两个解决方案是:
子类Dialog/ DialogPreference类和覆盖dispatchTouchEvent().
实现Window.Callback接口并Dialog通过发出以下命令将其设置为s窗口回调:
dialog.getWindow().setCallback(callbackImplementation);
Run Code Online (Sandbox Code Playgroud)
注意:此实现应通过调用适当的对话方法或以您自己的方式处理事件(例如,通过手动调用onUserInteraction())来处理所有收到的事件.
编辑
您有几种方法可以Activity从自定义PreferenceDialog实例中获取.
DialogPreference.getPreferenceManager()返回的调用方法PreferenceManager.它有一个getActivity()方法,但它是package-private,所以你必须把你的自定义DialogPreference放在android.preference包中才能访问它.
在PreferenceActivity.onCreate()扩充首选项后,使用按键findPreference()查找自定义DialogPreference.然后将其转换为您的自定义类,并this通过访问器设置活动.
我会选择第二种选择.
| 归档时间: |
|
| 查看次数: |
3178 次 |
| 最近记录: |