Всплывающее меню поверх Acticity

128
12 февраля 2018, 04:13

Я хочу сделать всплывающее меню/окно, которое не закрывает полностью активити(есть отступы) + при нажатии кнопки в этом самом меню оно закрывалось бы

Answer 1

DialogFragment

Ну и упрощенный пример.

Создаем подкласс DialogFragment, в рамках вопроса важными являются методы onStart() и onCreateDialog(), ими определяются размеры, вид, поведение диалога. Передачу данных в диалог, осуществляем аналогично обычным фрагментам, опять же по простому, в демонстрационных целях, newInstance(...), onCreateDialog(...)

public class SomeDialogFragment extends DialogFragment {
    private static final int MARGIN_H = 100;
    private static final int MARGIN_V = 200;
    private String name;
    static SomeDialogFragment newInstance(String text) {
        SomeDialogFragment fragment = new SomeDialogFragment();
        Bundle args = new Bundle();
        args.putString("name", text);
        fragment.setArguments(args);
        return fragment;
    }
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {   
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        //dialog.setCancelable(true);
        //dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        //dialog.getWindow().setBackgroundDrawable(?);
        name = getArguments().getString("name");
        return dialog;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.view_something, container, false);
        setupUI(name);
        return view;
    }
    @Override
    public void onStart() {
        super.onStart();
        if (getDialog() != null) {
            DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
            int width = displayMetrics.widthPixels;
            int height = displayMetrics.heightPixels;
            WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
            lp.copyFrom(getDialog().getWindow().getAttributes());
            lp.height = height - MARGIN_V;
            lp.width = width - MARGIN_H;
            // На "весь" экран, поверх Activity, с отступами от края экрана    
            getDialog().getWindow().setAttributes(lp);
        }
    }
    private void setupUI(String name){
        //UI
    }
}

Когда надо вызываем:

void showSomeDialog() {
    DialogFragment someDialog = SomeDialogFragment.newInstance("Привет, я dialog fragment, как ты хотел");
    someDialog.show(getFragmentManager(), "somedialog");
}

А "кнопку" добавить, думаю не проблема.

READ ALSO
Изменение элементов UI в потоке ответа Retrofit

Изменение элементов UI в потоке ответа Retrofit

Задача: Юзер в Activity вводит свой email и нажимает кнопкуПри нажатии с помощью Retrofit делается запрос на сервер, который высылает на email юзера пароль...

134
Наполнения массива java из методов

Наполнения массива java из методов

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

153
Считывание файлов из других каталогов в Java

Считывание файлов из других каталогов в Java

Пишу web-сервер на JavaНужно считать и послать файл, который находится в другом каталоге

145