我们要做的功能是点击按钮弹出一个内容框之后点击弹出的对话框的内容将内容显示在输入框中先来看下效果图
利用PopupWindow实现弹出的内容框,PopupWindow构造可以理解为ListView+TextView,ListView是整个显示内容的框架,而我们要显示的内容是用TextView展示的,展示的是一条一条的记录,是每一条item。
所以我们的步骤是:
1、在values文件夹下建立要显示的内容文件array.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="event_item"> <item>第一条记录</item> <item>第二条记录</item> <item>第三条记录</item> </string-array> </resources>
2、在layout文件夹下建立装载内容显示的文件list_popupwindow.xml,也就是一个ListView
<?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pop_list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:background="@color/colorGreen"> </ListView>
3、在layout文件夹下建立event_item_list.xml,也就是TextView
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center" android:background="@drawable/selector_pop_text" > </TextView>
selector_pop_text是当点击每一条TextView对于触发的不同的手势动作有不同的背景显示,例如当手指点击但不抬起也就是摁住它,它会显示什么背景所以第4步为:
4、该文件在res文件夹下新建一个drawable-nodpi文件夹在drawable-nodpi文件夹中建立selector_pop_text.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/light_blue" android:state_pressed="false" android:state _selected="true" /> <item android:drawable="@color/poptextselect" android:state_pressed="true" /> <item android:drawable="@color/poptext" android:state_pressed="false" android:state_se lected="false" /> </selector>
以上是PopupWindow需要的基本布局。
接下来我们在activity_main.xml中写我们的基本布局,因为我们要做的功能是点击按钮弹出一个内容框之后点击弹出的对话框的内容将内容显示在输入框中,所以我们需要输入框EditText和一个按钮Button,所以
6、在activity_main.xml重写布局如下
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" tools:context="com.android.by.mypopupwindow.MainActivity" android:orientation="vertical" > <LinearLayout android:id="@+id/root" android:layout_marginTop="55px" android:layout_width="match_parent" android:layout_height="81dp" android:orientation="horizontal" android:background="@drawable/editext_shape"> <EditText android:id="@+id/editext1" android:layout_width="290dp" android:layout_height="70dp" android:background="@null" android:layout_marginLeft="17dp" android:cursorVisible="true" /> <Button android:id="@+id/button1" android:layout_width="50dp" android:layout_height="50dp" android:background="@drawable/selector_add" android:layout_marginRight="0dp" android:layout_gravity="center" android:layout_marginTop="2dp" /> </LinearLayout> </LinearLayout>
其中editext_shape.xml是我们自己写的输入框背景将它放在drawable-nodpi文件夹下
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#00000000" /> <corners android:radius="8dp" /> <stroke android:width="1dp" android:color="#ff9800" /> </shape>
selector_add.xml是Button不同状态下的不同显示,内容框弹出按钮变暗,内容框消失按钮变亮,它同样在drawable-nodpi文件夹下
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/add_disable" android:state_enabled="false"></item> <item android:drawable="@drawable/add_press" android:state_pressed="true"></item> <item android:drawable="@drawable/add_press" android:state_pressed="false"></item> </selector>
7、开始写功能的逻辑实现,代码如下
package com.android.by.mypopupwindow; import android.app.Activity; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; public class MainActivity extends Activity { private LinearLayout root; private PopupWindow popUpWindow; private ListView listView; private EditText edittext1; private Button button1; private String contentData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); root = (LinearLayout) findViewById(R.id.root); edittext1 = (EditText) findViewById(R.id.editext1); button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showPopupWindow(); button1.setEnabled(false); } }); } private void showPopupWindow() { View popUpWindowView = getLayoutInflater(). inflate(R.layout.list_popupwindow, null);//引入layout中的布局文件 listView = (ListView) popUpWindowView.findViewById(R.id.pop_list); listView.setAdapter(new EventAdapter()); popUpWindow = new PopupWindow(popUpWindowView, RelativeLayout.LayoutParams. WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT,true); popUpWindow.setWidth(630); popUpWindow.setTouchable(true); popUpWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popUpWindow.setOutsideTouchable(true); popUpWindow.showAtLocation(root, Gravity.NO_GRAVITY, 50, 405); popUpWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { button1.setEnabled(true);//按钮变亮 } }); } private void closePopupWindow() { if (popUpWindow.isShowing()) { popUpWindow.dismiss(); } } /* 我们通过继承BaseAdapter使得每一个显示的TextView有相应的处理事件, 对于此部分读者可以自行百度ListView的Adapter并结合http://www.2cto.com/kf/201505/398415.html 这篇内容自行理解 */ class EventAdapter extends BaseAdapter{ private String[] array; public EventAdapter() { array = getResources().getStringArray(R.array.event_item); } @Override public int getCount() { return array.length; } @Override public Object getItem(int position) { return array[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView != null) { holder = (ViewHolder) convertView.getTag(); } else { convertView = LayoutInflater.from(MainActivity.this). inflate(R.layout.event_item_list, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); } contentData = array[position]; holder.view.setText(contentData); holder.view.setTextSize(20); convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (position == 0) { edittext1.setText(array[position]); } else if (position == 1) { edittext1.setText(array[position]); } else if (position == 2) { edittext1.setText(array[position]); } edittext1.setCursorVisible(true); edittext1.setSelection(edittext1.getText().length());//使输入框焦点在文字后 closePopupWindow(); } }); return convertView; } class ViewHolder { TextView view; public ViewHolder(View view) { this.view = (TextView) view; } } } }