Android: Как получить модальное диалоговое окно или подобное модальное поведение? - PullRequest
53 голосов
/ 25 мая 2011

В эти дни я работаю над симуляцией модального диалога в Android.Я много гуглил, есть много дискуссий, но, к сожалению, не так много вариантов, чтобы сделать это модальным.Вот некоторый фон,
Диалоги, Модальные Диалоги и Блокировка
Диалоги / AlertDialogs: Как "заблокировать выполнение", когда диалог открыт (стиль .NET)

Нет прямого способа получить модальное поведение, тогда я нашел 3 возможных решения,
1. Используйте занятие на тему диалога, как это thread сказал, но я все еще могу 'не заставлять основную деятельность действительно ждать возвращения диалоговой активности.Основная активность превратилась в состояние остановки и затем была перезапущена.
2. Создайте один рабочий поток и используйте синхронизацию потоков.Тем не менее, это огромная работа по рефакторингу для моего приложения, теперь у меня есть одно основное действие и служба в основном потоке пользовательского интерфейса.
3. Возьмите на себя обработку событий в цикле, когда есть модальное диалоговое окно, и выход из циклакогда диалог закрывается.На самом деле это способ создать настоящий модальный диалог, как это делается в Windows.Я до сих пор не прототипировал этот способ.

Я все еще хотел бы смоделировать его с помощью диалоговой темы,
1. Запустите диалоговое действие с помощью startActivityForResult ()
2. получите результатfrom onActivityResult ()
Вот некоторый источник

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    MyView v = new MyView(this);
    setContentView(v);
}

private final int RESULT_CODE_ALERT = 1;
private boolean mAlertResult = false;
public boolean startAlertDialog() {
    Intent it = new Intent(this, DialogActivity.class);
    it.putExtra("AlertInfo", "This is an alert");
    startActivityForResult(it, RESULT_CODE_ALERT);

    // I want to wait right here
    return mAlertResult;
}

@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case RESULT_CODE_ALERT:
        Bundle ret = data.getExtras();
        mAlertResult = ret.getBoolean("AlertResult");
        break;
    }
}
}

Вызывающая функция startAlertDialog заблокирует выполнение и ожидает возвращаемый результат.Но startAlertDialog вернулось немедленно, и основное действие перешло в состояние STOP, пока DialogActivity работала.

Итак, вопрос в том, как заставить основную деятельность действительно ждать результата?
Спасибо.

Ответы [ 11 ]

0 голосов
/ 27 июля 2018

Используйте BroadcastReceiver, который вызывает следующий метод, необходимый в действии.

Завершить работу кода активности в dialogFragment.show (fragment, TAG); и продолжить в onReceive () - я не на 100% уверен, но я бы положил деньги, что startActivityForResult (); основан именно на этой концепции.

Пока этот метод не будет вызван из получателя, код будет ожидать взаимодействия с пользователем без ANR.

Метод onCreateView DialogFragment

private static final String ACTION_CONTINUE = "com.package.name.action_continue";

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_dialog, container, false);
        Button ok_button = v.findViewById(R.id.dialog_ok_button);
        ok_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setAction(ACTION_CONTINUE);
                getActivity().getApplicationContext().sendBroadcast(i);
                dismiss();
            }
        });


    return v;
}

Этот метод зависит от создания класса расширения DialogFrament и вызова экземпляра этого класса посредством действия.

Однако ...

Простой, понятный, легкий и по-настоящему модальный.

...