Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Андроид, как вызывать PopUp окно по желанию?

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Так не работает

    private void ChangeItem(int item,String itemName,String itemType)
    {
        LayoutInflater layoutInflater = (LayoutInflater)getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
        View popupView = layoutInflater.inflate(R.layout.activity_popup_wnd,null);
        popupWindow = new PopupWindow(popupView,LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
        popupWindow.setFocusable(true);

        runOnUiThread((new Runnable() {
            @Override
            public void run() {
                if (!isFinishing()) {
                    popupWindow.showAtLocation(/*ReportMakerActivity.this.getWindow().getDecorView()*/
                            ReportMakerActivity.this.findViewById(R.id.armRL), Gravity.CENTER, 0, 0);
                }
            }
        }));

        Button ok,cancel;
        Spinner popUpSpinner=(Spinner)findViewById(R.id.change_fields_spinner);
        ok = (Button) findViewById(R.id.okPopUpBtn);
        cancel = (Button) findViewById(R.id.cancelPopUpBtn);
        cancel.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        popupWindow.dismiss();
                    }
                }
        );
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.fileds_types_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        popUpSpinner.setAdapter(adapter);
    }

Не могу понять, как поймать момент что оно пристегнулось к текущей активити, и можно инициализировать контролы на разметке этого попАпа.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Все разобрался, надо с контролами работать через ту вьюху которой они принадлежат
private void ChangeItem(int item,String itemName,String itemType) { LayoutInflater layoutInflater = (LayoutInflater)getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE); View popupView = layoutInflater.inflate(R.layout.activity_popup_wnd,null); popupWindow = new PopupWindow(popupView,LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); popupWindow.setFocusable(true); runOnUiThread((new Runnable() { @Override public void run() { if (!isFinishing()) { popupWindow.showAtLocation(ReportMakerActivity.this.findViewById(R.id.armRL), Gravity.CENTER, 0, 0); } } })); popupWindow.update(); Button ok,cancel; Spinner popUpSpinner=(Spinner)popupView.findViewById(R.id.change_fields_spinner); ok = (Button) popupView.findViewById(R.id.okPopUpBtn); cancel = (Button) popupView.findViewById(R.id.cancelPopUpBtn); cancel.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { popupWindow.dismiss(); } } ); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.fileds_types_array, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); popUpSpinner.setAdapter(adapter); }
Со спиннером странная сложность, ему зачем то нужно свойство

android:spinnerMode="dialog"

Где вы вызываете changeItem()?

Вопервых, напиши в чем проблема(ексепшен, логкат).
Во вторых, нужно добавлять в таких случаях иксмл разметку(если видишь что проблема как то относиться к юай)
Первое что бросается в глаза так это потенциальный налпоинтер: ты где кнопки свои ищешь? Это тебе не поле чудес))Если я правильно понимаю что ты хочешь сделать, так это «найти» кнопки ок, кенсел и спинер в твоем попапе(судя по названию). Так вот что бы их найти тебе нужно искать на этом(попап) лейауте\вьюхе, следовательно

Spinner popUpSpinner=(Spinner)popupView.findViewById(R.id.change_fields_spinner);
Ну и напоследок, тебя что на стаковерфлов уже забанили?)) Если да то пиши в приват
контакты\ссылку на гит, помогу советом, потому что судя по твоим темам на форуме ты вообще что то не в ту степь катишься.

Разметка есть
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/popUpLL" android:background="#FFFFFF" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.user.myapplication.ShowEventReport"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Change field of report" /> <EditText android:id="@+id/change_field_name_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text" /> <Spinner android:id="@+id/change_fields_spinner" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> <TextView android:id="@+id/dummyView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" /> <Button android:id="@+id/okPopUpBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@id/dummyView2" android:text="OK" /> <Button android:id="@+id/cancelPopUpBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/dummyView2" android:text="Cancel" /> </RelativeLayout> </LinearLayout>
На stackoverflow работающего решения не нашол. Исключение такого вида

BadTokenException: Unable to add window — token null is not valid; is your activity running?

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

developer.android.com/...​/view/LayoutInflater.html
View inflate (int resource,
ViewGroup root)
Ты пытаешься заинфлейтить

.inflate(R.layout.activity_popup_wnd,null);

то есть у тебя рут вью не указан.
Читай: поместить куда? ты пишешь поместить в "хз"\бездну\нулл

Что есть

рут вью

? Разметка текущей активити не подходит

java.lang.RuntimeException: view android.widget.RelativeLayout{42270aa0 V.E..... ......ID 0,0-720,1118 #7f0c0066 app:id/armRL} being added, but it already has a parent

Підписатись на коментарі