//下面我们给大家提供一个代码 就是现在很多的应用都是从底部弹出一个框 我们下面就给大家展示 首先我们看一下效果
首先我们需要的是准备工作 从下面进退肯定是动画 我们在res下面创建一个文件夹 anim 然后创建下面的两个xml文件
首先是进入的动画popshow_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromYDelta="100%p"
android:toYDelta="0" />
<alpha
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
然后是退出的动画pophidden_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromYDelta="0"
android:toYDelta="50%p" />
<alpha
android:duration="500"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
然后在style.xml文件中配置我们的动画
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="mypopwindow_anim_style">
<item name="android:windowEnterAnimation">@anim/popshow_anim</item>
<!-- 指定显示的动画xml -->
<item name="android:windowExitAnimation">@anim/pophidden_anim</item>
<!-- 指定消失的动画xml -->
</style>
</resources>
下面是我们的主类加载的布局 就是一个按钮 点击按钮弹出pop
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="openPopWindow"
android:text="从底部弹出一个popwindow" />
</LinearLayout>
下面展示的是弹出框的布局
pop.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"
android:orientation="vertical"
>
<GridView
android:id="@+id/gv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffffff"
android:numColumns="3"
android:layout_margin="10dp"
>
</GridView>
</LinearLayout>
然后是gridView 中item项的布局 test.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="horizontal" >
<TextView
android:id="@+id/gname"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:gravity="center"
android:background="@drawable/kinds"
android:text="aa"
android:layout_margin="10px"
/>
</LinearLayout>
布局中使用到两个xml文件是设置背景按钮的 在res下面创建一个文件夹 名drawable 下面是两个文件的代码
这个是kinds.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 填充颜色 -->
<solid android:color="#FFFFFF" >
</solid>
<!-- 线的宽度,颜色灰色 -->
<stroke
android:width="1dp"
android:color="#4f4f4f" >
</stroke>
<!-- 矩形的圆角半径 -->
<corners android:radius="10dp" />
</shape>
这个是yellow_but.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid
android:color="#ff7f00"
/>
<corners
android:radius="10dp"
/>
</shape>
现在准备工作基本上完成了 三个布局文件 两个动画 两个背景xml 还需要的一个是style.xml配置 下面就是我们的实现代码了 首先我们看一下主类中的实现代码
MainActivity.java
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnKeyListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.PopupWindow;
public class MainActivity extends Activity {
private PopupWindow popupWindow;
private View contentView;
private String[] kinds = { "休闲食品", "生鲜果蔬", "办公/家居", "其它", "鲜花", "蛋糕",
"大件物品" };
private MyGridAdapter adapter;
private List<String> list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
showPopwindow();
}
/**
* 显示popupWindow
*/
private void showPopwindow() {
//加载弹出框的布局
contentView = LayoutInflater.from(MainActivity.this).inflate(
R.layout.pop, null);
//绑定控件
GridView gridView = (GridView) contentView.findViewById(R.id.gv);
//创建集合 模拟数据
list = new ArrayList<String>();
for (int i = 0; i < kinds.length; i++) {
list.add(kinds[i]);
}
//初始化适配器
adapter = new MyGridAdapter(MainActivity.this, list);
//添加适配器
gridView.setAdapter(adapter);
//gridview点击的监听
gridView.setOnItemClickListener(new ItemClickListener());
//设置弹出框的宽度和高度
popupWindow = new PopupWindow(contentView,
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setFocusable(true);// 取得焦点
//注意 要是点击外部空白处弹框消息 那么必须给弹框设置一个背景色 不然是不起作用的
popupWindow.setBackgroundDrawable(new BitmapDrawable());
//点击外部消失
popupWindow.setOutsideTouchable(true);
//设置可以点击
popupWindow.setTouchable(true);
//进入退出的动画
popupWindow.setAnimationStyle(R.style.mypopwindow_anim_style);
// 按下android回退物理键 PopipWindow消失解决
gridView.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (popupWindow != null && popupWindow.isShowing()) {
popupWindow.dismiss();
return true;
}
}
return false;
}
});
}
/**
* 点击item项的监听
* @author Administrator
*
*/
public class ItemClickListener implements OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
//背景选择
adapter.setSeclection(position);
//适配器通知数据改变
adapter.notifyDataSetChanged();
}
}
/**
* 按钮的监听
* @param v
*/
public void openPopWindow(View v) {
//从底部显示
popupWindow.showAtLocation(contentView, Gravity.BOTTOM, 0, 0);
}
}
上面的代码中 我们的注释写的很明确 可以好好看看注释 帮助更好的理解 我们从上面的代码中我们看到 我们还需要一个适配器 下面我们展示一下适配器的代码 很简单哦
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MyGridAdapter extends BaseAdapter {
private Context context;
private List<String> list;
TextView kind;
private int clickTemp = -1;
// 标识选择的Item
public void setSeclection(int position) {
clickTemp = position;
}
public MyGridAdapter(Context context, List<String> list) {
super();
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
R.layout.test, null);
kind = (TextView) convertView.findViewById(R.id.gname);
convertView.setTag(kind);
} else {
kind = (TextView) convertView.getTag();
}
kind.setText(list.get(position));
if (clickTemp == position) {
kind.setBackgroundResource(R.drawable.yellow_but);
} else {
kind.setBackgroundResource(R.drawable.kinds);
}
return convertView;
}
}
看上面的适配器 我们的背景选择就是在适配器中定义了一个方法 传一下我们点击的position 然后选择背景