popupWindow与AlterDialog的区别:
PopupWindow是可以指定显示位置的(contentView,Width,Height这三个元素是必须设置)。
AlertDialog不能指定显示位置,只能默认显示在屏幕最中间但可以通过设置WindowManager参数来改变位置。
popupWindow设置不同的父布局居然在弹出框之后还可以与activity交互:
popupwindow的代码如下:
package com.example.pulltorefreshdemo.fragment;
import com.example.pulltorefreshdemo.R;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.provider.Telephony.Sms.Conversations;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
importandroid.view.ViewTreeObserver.OnGlobalLayoutListene;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.PopupWindow;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.TextView;
public class FirstFragment extends Fragment implements OnClickListener {
private Button btn_show;
private PopupWindow popup;
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = LayoutInflater.from(getActivity()).inflate(R.layout.item_popupwindow, container, false);
intView(view);
return view;
}
private void intView(View view) {
btn_show=(Button) view.findViewById(R.id.btn_show);
btn_show.setOnClickListener(this);
}
public void showpopupWindow(){
View contentView=View.inflate(getActivity(), R.layout.item_child_popupwindow, null);
if(popup==null){
popup=new PopupWindow(contentView,LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
Button btn1=(Button) contentView.findViewById(R.id.button1);
Button btn2=(Button) contentView.findViewById(R.id.button2);
Button btn3=(Button) contentView.findViewById(R.id.button3);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
popup.setBackgroundDrawable(new ColorDrawable(0x00ff00));
//点击外围消失
//popup.setOutsideTouchable(false);
final WindowManager.LayoutParams params = getActivity().getWindow().getAttributes();
params.alpha = 0.7f;
getActivity().getWindow().setAttributes(params);
popup.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
params.alpha =1f;
getActivity().getWindow().setAttributes(params);
}
});
//显示在相对于父布局显示,不必一定要是父布局,父布局的控件也可以
popup.showAtLocation(btn_show, Gravity.BOTTOM, 0, 0);
//popup.showAsDropDown(btn_show);
}
@Override
public void onClick(View v) {
int id=v.getId();
if(id==R.id.btn_show){
if(popup==null){
showpopupWindow();
}else{
if(popup.isShowing()){
popup.dismiss();
}else{
showpopupWindow();
}
}
}else if(R.id.button1==id){
popup.dismiss();
}else if(R.id.button2==id){
popup.dismiss();
}else if(R.id.button3==id){
popup.dismiss();
}
}
}
在父布局根元素设置为LinearLayout之后,可以与activity交互: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"
android:background="#ffff00"
>
<LinearLayout
android:layout_gravity="bottom"
android:orientation="vertical"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
在父布局根元素设置为RelativeLayout之后,不可以与activity交互: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="match_parent"
android:orientation="vertical"
android:background="#ffff00"
>
<LinearLayout
android:layout_gravity="bottom"
android:orientation="vertical"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
</RelativeLayout>
设置动画样式
首先准备一个进入动画,一个退出动画:
enter.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:duration="@android:integer/config_shortAnimTime"
android:fromXDelta="0"
android:fromYDelta="100%p" android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toXDelta="0"
android:toYDelta="0"/>
</set>
exit.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate android:duration="@android:integer/config_shortAnimTime"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toXDelta="0"
android:toYDelta="100%p" />
</set>
在values文件夹中添加以下的样式
<style name="Anim" parent="@android:style/Animation.Activity">
<item name="android:windowEnterAnimation">@anim/enter</item>
<item name="android:windowExitAnimation">@anim/exit</item>
最后给popupWindow设置样式即可
popup.setAnimationStyle(R.style.Anim);
参考: http://blog.csdn.net/harvic880925/article/details/49272285