【问题标题】:How to create a popup window (PopupWindow) in Android如何在Android中创建一个弹出窗口(PopupWindow)
【发布时间】:2011-08-22 03:30:42
【问题描述】:

要创建一个简单的工作 PopupWindow,我们需要执行以下操作:

popup_example.xml:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:padding="10dip"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <TextView         
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dip"
            android:text="Test Pop-Up" />

    </LinearLayout>

Java 代码

LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

PopupWindow pw = new PopupWindow(inflater.inflate(R.layout.popup_example, null, false),100,100, true);

pw.showAtLocation(this.findViewById(R.id.main), Gravity.CENTER, 0, 0);

我的要求是我需要一个

<TEXTVIEW android:layout_height="wrap_content" android:layout_width="fill_parent" />

还有一个

<BUTTON android:id="@+id/end_data_send_button" android:text="Cancel"/>

在我的popup_example.xml。如何在我的 Java 代码中处理这两个组件?

【问题讨论】:

  • 根据您显示的内容,这些可能应该是 Dialog 而不是 PopupWindow。
  • ...现在比以往任何时候都可以使用 DialogFragments developer.android.com/guide/topics/ui/dialogs.html
  • 嘿,我可以使用弹出窗口显示放大的图像(单击图像),该图像动态显示在列表视图中吗?谢谢。

标签: android popupwindow android-popupwindow


【解决方案1】:

如何制作一个简单的Android弹窗

这是一个更完整的例子。这是一个补充答案,一般涉及创建弹出窗口,不一定是 OP 问题的具体细节。 (OP 要求取消按钮,但这不是必需的,因为用户可以单击屏幕上的任意位置来取消它。)它将如下图所示。

为弹出窗口制作布局

res/layout 添加一个布局文件,用于定义弹出窗口的外观。

popup_window.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#62def8">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_margin="30dp"
        android:textSize="22sp"
        android:text="This is a popup window."/>

</RelativeLayout>

充气并显示弹出窗口

这是我们示例的主要活动的代码。每当单击按钮时,弹出窗口就会膨胀并显示在活动上。触摸屏幕上的任意位置都会关闭弹出窗口。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onButtonShowPopupWindowClick(View view) {

        // inflate the layout of the popup window
        LayoutInflater inflater = (LayoutInflater)
                getSystemService(LAYOUT_INFLATER_SERVICE);
        View popupView = inflater.inflate(R.layout.popup_window, null);

        // create the popup window
        int width = LinearLayout.LayoutParams.WRAP_CONTENT;
        int height = LinearLayout.LayoutParams.WRAP_CONTENT;
        boolean focusable = true; // lets taps outside the popup also dismiss it
        final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);

        // show the popup window
        // which view you pass in doesn't matter, it is only used for the window tolken
        popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);

        // dismiss the popup window when touched
        popupView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                popupWindow.dismiss();
                return true;
            }
        });
    }
}

就是这样。你已经完成了。

进行中

查看how gravity values effect PopupWindow

你也可以add a shadow

进一步研究

这些对于学习如何制作弹出窗口也很有帮助:

【讨论】:

  • 我不知道为什么,但是当我使用方法 showAtLacation 时,我在充气机中的自定义布局不起作用。结果在你的截图上
  • @MartinezToni,我也不知道为什么。
  • 非常好的和周到的回应!感谢您发布此内容
  • context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);用于通过公共类访问。 :)
  • 对话框和弹窗有什么区别??
【解决方案2】:

在这里,我给你一个演示示例。查看此内容并根据您的需要进行自定义。

public class ShowPopUp extends Activity {
    PopupWindow popUp;
    boolean click = true;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        popUp = new PopupWindow(this);
        LinearLayout layout = new LinearLayout(this);
        LinearLayout mainLayout = new LinearLayout(this);
        TextView tv = new TextView(this);
        Button but = new Button(this);
        but.setText("Click Me");
        but.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (click) {
                     popUp.showAtLocation(layout, Gravity.BOTTOM, 10, 10);
                     popUp.update(50, 50, 300, 80);
                     click = false;
                } else {
                     popUp.dismiss();
                     click = true;
                }
            }
        });

        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT);
        layout.setOrientation(LinearLayout.VERTICAL);
        tv.setText("Hi this is a sample text for popup window");
        layout.addView(tv, params);
        popUp.setContentView(layout);
        // popUp.showAtLocation(layout, Gravity.BOTTOM, 10, 10);
        mainLayout.addView(but, params);
        setContentView(mainLayout);
   }
}

希望这能解决您的问题。

【讨论】:

【解决方案3】:

你完成了布局膨胀吗?也许你可以试试这个!

View myPoppyView = pw.getContentView();
Button myBelovedButton = (Button)myPoppyView.findViewById(R.id.my_beloved_button);
//do something with my beloved button? :p

【讨论】:

    【解决方案4】:

    我构建自己的类,然后从我的活动中调用它,覆盖诸如 showAtLocation 之类的小方法。当我的活动中有 4 到 5 个弹出窗口时,我发现这样做更容易。

    public class ToggleValues implements OnClickListener{
    
        private View pView;
        private LayoutInflater inflater;
        private PopupWindow pop;
        private Button one, two, three, four, five, six, seven, eight, nine, blank;
        private ImageButton eraser;
        private int selected = 1;
        private Animation appear;
    
        public ToggleValues(int id, Context c, int screenHeight){
            inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            pop = new PopupWindow(inflater.inflate(id, null, false), 265, (int)(screenHeight * 0.45), true);
            pop.setBackgroundDrawable(c.getResources().getDrawable(R.drawable.alpha_0));
            pView = pop.getContentView();
    
            appear = AnimationUtils.loadAnimation(c, R.anim.appear);
    
            one = (Button) pView.findViewById(R.id.one);
            one.setOnClickListener(this);
            two = (Button) pView.findViewById(R.id.two);
            two.setOnClickListener(this);
            three = (Button) pView.findViewById(R.id.three);
            three.setOnClickListener(this);
            four = (Button) pView.findViewById(R.id.four);
            four.setOnClickListener(this);
            five = (Button) pView.findViewById(R.id.five);
            five.setOnClickListener(this);
            six = (Button) pView.findViewById(R.id.six);
            six.setOnClickListener(this);
            seven = (Button) pView.findViewById(R.id.seven);
            seven.setOnClickListener(this);
            eight = (Button) pView.findViewById(R.id.eight);
            eight.setOnClickListener(this);
            nine = (Button) pView.findViewById(R.id.nine);
            nine.setOnClickListener(this);
            blank = (Button) pView.findViewById(R.id.blank_Selection);
            blank.setOnClickListener(this);
            eraser = (ImageButton) pView.findViewById(R.id.eraser);
            eraser.setOnClickListener(this);
        }
    
        public void showAtLocation(View v) {
            pop.showAtLocation(v, Gravity.BOTTOM | Gravity.LEFT, 40, 40);
            pView.startAnimation(appear);
        }
    
        public void dismiss(){ 
            pop.dismiss();
        }
    
        public boolean isShowing() {
            if(pop.isShowing()){
                return true;
            }else{
                return false;
            }
        }
    
        public int getSelected(){
            return selected;
        }
    
        public void onClick(View arg0) {
            if(arg0 == one){
                Sudo.setToggleNum(1);
            }else if(arg0 == two){
                Sudo.setToggleNum(2);
            }else if(arg0 == three){
                Sudo.setToggleNum(3);
            }else if(arg0 == four){
                Sudo.setToggleNum(4);
            }else if(arg0 == five){
                Sudo.setToggleNum(5);
            }else if(arg0 == six){
                Sudo.setToggleNum(6);
            }else if(arg0 == seven){
                Sudo.setToggleNum(7);
            }else if(arg0 == eight){
                Sudo.setToggleNum(8);
            }else if(arg0 == nine){
                Sudo.setToggleNum(9);
            }else if(arg0 == blank){
                Sudo.setToggleNum(0);
            }else if(arg0 == eraser){
                Sudo.setToggleNum(-1);
            }
            this.dismiss();
        }
    
    }
    

    【讨论】:

    • 如何从按钮点击动作中调用这个 ToggleValues 类
    【解决方案5】:
    Button endDataSendButton = (Button)findViewById(R.id.end_data_send_button);
    

    同样你可以通过添加一个 id 来获得文本视图。

    【讨论】:

    • @user746108 pw.showAtLocation(this.findViewById(R.id.text_view), Gravity.CENTER, 0, 0); TextView 仅显示在弹出窗口中..如何修复按钮的位置
    【解决方案6】:
    LayoutInflater inflater = (LayoutInflater) SettingActivity.this.getSystemService(SettingActivity.LAYOUT_INFLATER_SERVICE); 
    PopupWindow pw = new PopupWindow(inflater.inflate(R.layout.gd_quick_action_slide_fontsize, null),LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT, true);
    pw.showAtLocation(SettingActivity.this.findViewById(R.id.setting_fontsize), Gravity.CENTER, 0, 0);
    View v= pw.getContentView();
    TextView tv=v.findViewById(R.id.....);
    

    【讨论】:

      【解决方案7】:

      这是我的代码中的一个示例,如何在弹出窗口中处理小部件(按钮)

      View v=LayoutInflater.from(getContext()).inflate(R.layout.popupwindow, null, false);
          final PopupWindow pw = new PopupWindow(v,500,500, true);
          final Button button = rootView.findViewById(R.id.button);
          button.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  pw.showAtLocation(rootView.findViewById(R.id.constraintLayout), Gravity.CENTER, 0, 0);
      
      
              }
          });
          final Button popup_btn=v.findViewById(R.id.popupbutton);
      
          popup_btn.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  popup_btn.setBackgroundColor(Color.RED);
              }
          });
      

      希望对你有帮助

      【讨论】:

        【解决方案8】:

        编辑您的style.xml

        <style name="AppTheme" parent="Base.V21.Theme.AppCompat.Light.Dialog">
        

        Base.V21.Theme.AppCompat.Light.Dialog 提供了一个android 弹出式主题

        【讨论】:

          猜你喜欢
          • 2014-05-26
          • 1970-01-01
          • 1970-01-01
          • 2021-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          相关资源
          最近更新 更多