1

В настоящее время у меня есть кнопка, внутри Linear Layout, например, так:Отображать PopupWindow при нажатии кнопки?

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="@string/open_popup" 
     android:onClick="createPopup"/> 
</LinearLayout> 

У меня также есть расширение createPopup (которое действительно выполняется при нажатии на кнопку).

public void createPopup(View view) { 

} 

Я попытался создать PopupWindow с TextView внутри него. Затем я позвонил showAtLocation(parent, gravity, x, y), где parent - корень LinearLayout. gravity был Gravity.BOTTOM, x и y оба были установлены в 10.

Когда я нажал кнопку, я получил ошибку IllegalStateException, где я позвонил showAtLocation(). Вот createPopup() функция:

PopupWindow popUp; 
LinearLayout layout; 
LinearLayout main; 
TextView value; 
LayoutParams params; 
boolean click = true; 
public void createPopup(View view) { 
    popUp = new PopupWindow(this); 
    layout = new LinearLayout(this); 
    main = (LinearLayout) findViewById(R.id.parent); 
    value = new TextView(this); 
    if(click) { 
     popUp.showAtLocation(main, Gravity.BOTTOM, 10, 10); 
     popUp.update(50, 50, 300, 80); 
     click = false; 
    } else { 
     popUp.dismiss(); 
     click = true; 
    } 
    params = new LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT); 
    layout.setOrientation(LinearLayout.VERTICAL); 
    value.setText(R.string.message); 
    layout.addView(value, params); 
    popUp.setContentView(layout); 
    setContentView(main); 
    TextView status = (TextView) findViewById(R.id.status); 
    status.setTextSize(28); 
    status.setText("Status of Popup: Don't worry, you're never going to get this."); 
} 

То, что я хотел бы знать:

  • Что это означает, что ошибка?
  • Почему это отображается?
  • Как это исправить?
  • Как создать простое всплывающее окно, которое появляется при щелчке кнопки? *

* Я хотел бы быть в состоянии создать функцию, где она занимает по меньшей мере, один параметр (который был бы a String), а затем создать всплывающее окно, содержащее это String, а также кнопку, чтобы закрыть всплывающее окно.

EDIT: Не уверен, если это связано с всплывающей вопросом, но при запуске приложения, я получаю эту ошибку:

07-13 19:51:48.448 133-133/? E/[EGL-ERROR]: egl_image* _egl_create_image_ANDROID_native_buffer(egl_display*, egl_context*, EGLClientBuffer, EGLint*, void*):593: CHUN try create image with crop 0,0,0,0 


              [ 07-13 19:51:48.448 133: 133 E/   ] 
              CHUN map external image rgb 1024 x 600 

ВТОРОЙ EDIT: я добавил соответствующий код, приведенный выше ,

+0

Опубликовать полный стек ошибки. включая сообщение об ошибке, что важно. – JoxTraex

+0

Я не знаю, смогу ли я воспроизвести его, но я могу попробовать. –

+0

Пожалуйста, убедитесь, что пять полных стеков стека при ошибке дают невероятную помощь для понимания того, что происходит. – JoxTraex

ответ

2

Если вы изучаете, как реализовать диалог, то, что я обычно делаю, это создать отдельный файл макета, файл класса и вызвать его там, где он должен быть показан. Диалоги показывают другую деятельность в центре, и, насколько я знаю, они не могут быть перемещены.

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

private void openMyDialog() { 
    MyDialog dialog = new MyDialog(this); 
    dialog.show(); 
} 

MyDialog.java необходимо расширить Dialog и внедрить android.view.View.OnClickListener. Он будет содержать любой код, необходимый для сохранения или управления элементами на вашем макете. MyDialog.java:

import android.app.Activity; 
import android.app.Dialog; 
import android.os.Bundle; 
import android.support.v7.app.AlertDialog; 
import android.view.View; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.EditText; 

public class MyDialog extends Dialog implements android.view.View.OnClickListener { 

    public Activity activity; 

    public MyDialog() { 
     super(null); 
    } 
    public MyDialog(Activity activity) { 
     super(activity); 
     this.activity = activity; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.my_dialog); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      default: 
       break; 
     } 
     dismiss(); 
    } 

} 

my_dialog.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="#1C1C1C"> 
<!-- Whatever your layout will consist of can go here --> 

</RelativeLayout> 

Я надеюсь, что это ответ на ваш вопрос. Если это не так, не стесняйтесь комментировать этот пост. Я не знаю, как исправить вашу ошибку (так как это не полная ошибка), но я знаю, как реализовать пользовательские диалоги (или всплывающие окна), чтобы переходить к вашей другой деятельности.

+0

Спасибо за ваш ответ. Я пробую ваше решение, и тогда я вернусь и посмотрю, как это работает в документах. Не могли бы вы добавить операторы импорта, которые вы используете? –

+0

Я думаю, что я вставил все необходимые ... Я скопировал это из большого файла, который имеет кучу других импортов для других вещей, которые вам не понадобятся. Дайте мне знать, если у вас есть еще вопросы! – TheAnonymous010

+0

О строке 18 говорится: 'this.activity = activity'. Android Studio говорит мне, что она не может быть решена. Вы хотели сделать 'this.setOwnerActivity (activity)'? –

Смежные вопросы