网上那么多写PopupWindow示例的,写简单点不行么?
为了达到上图效果,我们首先要做几项工作:
1 定义个圆角背景;ques_bg.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 设置圆角半径 还可分别详细设置上下左右4个圆角--> <corners android:radius="5dp"/> <!-- 内部颜色 --> <solid android:color="@android:color/white"/> <!-- 边框宽度 边框颜色 --> <stroke android:width="1dp" android:color="@android:color/darker_gray"/> </shape>
2 建立个ListView所在的layout,给PopWindow作填充;pop_list.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/pop_lv" android:layout_width="match_parent" android:layout_height="wrap_content" android:listSelector="@android:color/holo_blue_dark" android:background="@drawable/ques_bg" /> </LinearLayout>
3 建立个含有TaxtView布局的layout: list_content.xml,给listView作填充,当然懒省事也可以直接用android.R.layout.android.R.layout.simple_list_item_1;list_content.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_content_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" />
4 当然最后还需要个主界面
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="200dp" android:orientation="horizontal" > <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="0.1" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.9" android:padding="10dp" android:text="@string/ques_1" /> <TextView android:id="@+id/tv_with_pop" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3.1" android:padding="10dp" android:text="@string/first" android:background="@drawable/ques_bg" /> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="0.1" /> </LinearLayout> </RelativeLayout>
package com.example.popwindow; import android.app.Activity; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; public class MainActivity extends Activity { // 列表数据 private String[] popContents = new String[] { "第一个密保问题", "第二个密保问题", "第三个密保问题", "第四个密保问题", }; // 点击此文本出现下拉popWindow private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.tv_with_pop); // 初始化显示 mTextView.setText(popContents[0]); } @Override protected void onStart() { super.onStart(); //获取屏幕宽度 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); //设置popupWindow的宽度,这几个数字是根据布局中的textView权重得出的4.2表示这一行的总权重,3.1表示textView的权重 int with = (int) ((metrics.widthPixels / 4.2) * 3.1); // 找到需要填充到pop的布局 View view = LayoutInflater.from(this).inflate(R.layout.pop_list, null); // 根据此布局建立pop final PopupWindow popupWindow = new PopupWindow(view); // <<<<<<<<<<<<<<<<<<<极其重要>>>>>>>>>>>>>>>>>>>>> popupWindow.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT); // popupWindow.setWidth(LinearLayout.LayoutParams.MATCH_PARENT); popupWindow.setWidth(with); //这样设置pop才可以缩回去 popupWindow.setBackgroundDrawable(new BitmapDrawable()); popupWindow.setOutsideTouchable(true); popupWindow.setFocusable(true); // 填充此布局上的列表 ListView listView = (ListView) view.findViewById(R.id.pop_lv); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.list_content, popContents); listView.setAdapter(adapter); // 当listView受到点击时替换mTextView当前显示文本 listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { mTextView.setText(popContents[arg2]); popupWindow.dismiss(); } }); // 当mTextView受到点击时显示pop mTextView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { popupWindow.showAsDropDown(v); } }); } }