Запуск действия Android в виде диалога без использования модификатора темы - PullRequest
0 голосов
/ 23 сентября 2010

Я хочу запустить упражнение в виде диалога, который может быть просто выполнен:

<activity android:theme="@android:style/Theme.Dialog">

Но я хочу управлять диалогом, поэтому я делаю это программно. В основном я хочу изменить это свойство диалога:

mCanceledOnTouchOutside = true

Это заставит диалог отменяться при касании за его пределами. (В основном я хочу повторить всплывающее поведение). Проблема в том, что я не могу просто создать диалог и установить его макет, так как мне нужен вызов действия (для инициализированных наборов данных)

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 26 сентября 2010

С тех пор это не так, потому что действие - это не диалог. Устанавливая тему, все, что вы делаете, это заставляете деятельность визуально использовать тему диалога. Это все еще деятельность, однако, будет все нормальное поведение деятельности. Другими словами, нет объекта Dialog со связанным с ним поведением.

1 голос
/ 28 октября 2010

Я просто хотел воспроизвести это поведение CancelOutside Dialog в одном из моих действий в стиле Dialog.Для этого я извлек исходный код Dialog (Dialog.java), обрабатывающий событие касания:

public boolean onTouchEvent(MotionEvent event) {
    if (mCancelable && mCanceledOnTouchOutside && event.getAction() == MotionEvent.ACTION_DOWN && isOutOfBounds(event)) {
        cancel();
        return true;
    }
    return false;
}

private boolean isOutOfBounds(MotionEvent event) {
    final int x = (int) event.getX();
    final int y = (int) event.getY();
    final int slop = ViewConfiguration.get(mContext).getScaledWindowTouchSlop();
    final View decorView = getWindow().getDecorView();
    return (x < -slop) || (y < -slop) || (x > (decorView.getWidth()+slop)) || (y > (decorView.getHeight()+slop));
}

Копирую его, вставляю его в свою деятельность в стиле диалога и изменяю мелочи:

public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN && isOutOfBounds(event)) {
        finish();
        return true;
    }
    return false;
}

private boolean isOutOfBounds(MotionEvent event) {
    final int x = (int) event.getX();
    final int y = (int) event.getY();
    final int slop = ViewConfiguration.get(this).getScaledWindowTouchSlop();
    final View decorView = getWindow().getDecorView();
    return (x < -slop) || (y < -slop) || (x > (decorView.getWidth() + slop)) || (y > decorView.getHeight() + slop));
}

Работает отлично!

0 голосов
/ 23 сентября 2010

Вы можете определить свой собственный стиль, который расширяет Theme.Dialog в файле values/styles.xml (или как вы хотите его называть). Проверить http://developer.android.com/guide/topics/ui/themes.html#Inheritance.

Я не уверен, что это сработает, но, возможно, попробуйте что-то вроде:

<style name="DialogCancelOnTouchOutside" parent="@android:style/Theme.Dialog">
    <item name="android:canceledOnTouchOutside">true</item>
</style>
...