диалог появляется очень медленно - PullRequest
0 голосов
/ 07 августа 2020

В моем приложении я реализовал этот настраиваемый диалог (который имеет довольно сложный макет), расширив DialogFragment. Я ожидаю, что это диалоговое окно появится, когда я нажму кнопку в моем макете. (Чего я успешно добился). Но проблема в том, что диалоговое окно отображается некорректно.

Мой собственный класс диалогового окна:

public class CustomizeDialog extends DialogFragment implements AdapterView.OnItemSelectedListener {
    // field declarations go here
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.customize_dialog, null);

        builder.setView(view)
                .setTitle("Customize")
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .setPositiveButton("Let's go!", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent();
                        intent.setAction("fromDialog");
                        intent.putExtra("ratio",getRatio(paperSizeSpinner.getSelectedItem().toString()));
                        if(isOrientationSpinnerVisible){
                            intent.putExtra("isCustom",false);
                            intent.putExtra("orientation",orientationSpinner.getSelectedItem().toString());
                        } else {
                            intent.putExtra("isCustom",true);
                        }
                        intentProvider.getIntent(intent);
                    }
                });

        widthEditText = view.findViewById(R.id.width_et);
        heightEditText = view.findViewById(R.id.height_et);

        widthEditText.setEnabled(false);
        heightEditText.setEnabled(false);

        paperSizeSpinner = view.findViewById(R.id.paper_size_spinner);
        orientationSpinner = view.findViewById(R.id.orientation_spinner);
        // ArrayList for populating paperSize spinner via paperSizeAdapter
        ArrayList<String> paperSizes = new ArrayList<>();
        paperSizes.add("A0");
        paperSizes.add("A1");
        paperSizes.add("A2");
        paperSizes.add("A3");
        paperSizes.add("A4");
        paperSizes.add("A5");
        paperSizes.add("Custom");
        // ArrayList for populating orientation spinner via orientationAdapter
        ArrayList<String> orientation = new ArrayList<>();
        orientation.add("Portrait");
        orientation.add("Landscape");
        // arrayAdapters containing arraylists to populate spinners
        ArrayAdapter paperSizeAdapter = new ArrayAdapter(getActivity(), android.R.layout.simple_spinner_dropdown_item, paperSizes);
        ArrayAdapter orientationAdapter = new ArrayAdapter(getActivity(), android.R.layout.simple_spinner_dropdown_item, orientation);
        paperSizeSpinner.setAdapter(paperSizeAdapter);
        orientationSpinner.setAdapter(orientationAdapter);

        paperSizeSpinner.setSelection(4);
        paperSizeSpinner.setOnItemSelectedListener(this);
        orientationSpinner.setOnItemSelectedListener(this);
        return builder.create();
    }

    // These are some important complex ui functionalities
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        if (parent.getId() == R.id.paper_size_spinner) {
            if (position == 6) {
                widthEditText.setEnabled(true);
                heightEditText.setEnabled(true);
                orientationSpinner.setEnabled(false);
                isOrientationSpinnerVisible = false;
            } else {
                widthEditText.setEnabled(false);
                heightEditText.setEnabled(false);
                orientationSpinner.setEnabled(true);
                isOrientationSpinnerVisible = true;
            }
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
    // interface used to communicate with the parent activity
    public interface IntentProvider {
        // this method is used to provide the intent to the parent activity
        void getIntent(Intent intent);
    }
    // instantiating the interface object and throwing error if parent activity does not implement this interface
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            intentProvider = (IntentProvider) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement IntentProvider");
        }
    }

}

Класс MainActivity:

public class MainActivity extends AppCompatActivity implements CustomizeDialog.IntentProvider {
    // field declarations go here
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.image);
        // instantiating the dialog
        final CustomizeDialog dialog = new CustomizeDialog();
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // showing the dialog on click
                dialog.show(getSupportFragmentManager(),"");
            }
        });

    }
    // via this method I receive the intent from the dialog
    // I know intent might not be the best option for this function but let's let it be here for now
    @Override
    public void getIntent(Intent intent) {
        ratio = intent.getFloatExtra("ratio",3);
        isCustom = intent.getBooleanExtra("isCustom",false);
        orientation = intent.getStringExtra("orientation");
        launchChooser();
    }
}

Сообщите мне в комментарии, если вам нужен код макета для диалога.

Что я пробовал:

  1. Реализация потоковой передачи, чтобы мой диалог был готов в фоновом потоке и покажите это onButtonClick. Но в целом это запрещено, так как любой другой поток, кроме потока пользовательского интерфейса, не должен касаться событий, связанных с пользовательским интерфейсом.
  2. Использование onCreateView вместо onCreateDialog для непосредственного расширения макета.
  3. Создание диалога глобальную переменную, инициализировал ее в onCreate, а затем отобразил диалоговое окно onButtonClick.
  4. Переключено на РАСПОЛОЖЕНИЕ ОГРАНИЧЕНИЙ
  5. Использование действия в качестве диалогового окна путем установки темы диалогового окна на активность в файле манифеста.
  6. Запустил мое приложение на устройстве с лучшим оборудованием, чем мое. НИЧЕГО НЕ РАБОТАЕТ

Что я хочу:

Почему мой диалог дергается? и что мне нужно сделать, чтобы диалоговое окно появилось быстрее?

На случай, если кто-то захочет здесь - ссылка на репозиторий моего приложения на github.

1 Ответ

0 голосов
/ 04 сентября 2020
Фреймворки

AlertDialog и DialogFragment работают медленно, потому что им требуется некоторое время для выполнения вычислений и обработки фрагментов. Таким образом, решение этой проблемы заключается в том, чтобы сразу же использовать структуру Dialog.

  1. Используйте Dialog framework Dialog dialog = new Dialog(context);
  2. Определите макет, а затем используйте dialog.setContentView(R.layout.name_of_layout).
  3. Используйте dialog.findViewById(R.id.name_of_view) для ссылки на представления из файла макета диалогового окна

А затем реализуйте logi c точно так же, как любой другой поступил бы в классе активности. Найдите лучшую реализацию для вашего варианта использования, прочитав официальную документацию .

Использование диалоговой структуры решило проблему для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...