Android之PopWindow

这篇博客主要介绍了Android中PopWindow的使用,并结合RadioButton和RadioGroup展示了如何实现单选功能。博主通过代码示例分享了布局文件和接口调用的方法,同时提到了在使用PopWindow时主动打开输入软件盘的EditText操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文只是记录一些零碎的东西

真的是受不了自己了,以为自己记录了,再次要使用时,居然没有找到!

PopWindow的使用,这里还记录了一下RadioButton和RadioGroup的组合使用,可以实现单选,直接上代码



看一下布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map_order_cancle_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="@dimen/map_bottom_text_left" >
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
		android:orientation="horizontal">

        <TextView
            android:id="@+id/order_cancle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:paddingLeft="@dimen/map_bottom_text_left"
            android:textColor="@android:color/black"
            android:textSize="@dimen/map_order_cancle"
            android:text="@string/map_cancle" />

        <TextView
            android:id="@+id/order_sure"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="right"
            android:textColor="@android:color/black"
            android:layout_weight="0.5"
            android:paddingRight="@dimen/map_bottom_text_left"
            android:textSize="@dimen/map_order_cancle"
            android:text="@string/map_sure" />

    </LinearLayout>

    <RadioGroup
        android:id="@+id/order_cancle_rg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <RadioButton
            android:id="@+id/order_cancle_rg_one"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/black"
            android:text="@string/map_order_can1" 
            android:checked="true"/>

        <RadioButton
            android:id="@+id/order_cancle_rg_two"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/black"
            android:text="@string/map_order_can2" />

        <RadioButton
            android:id="@+id/order_cancle_rg_three"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/black"
            android:text="@string/map_order_can3" />
    </RadioGroup>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
		android:orientation="horizontal">

        <RadioButton
            android:id="@+id/order_cancle_rg_four"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <EditText
            android:id="@+id/order_cancle_rg_four_content"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textColor="@android:color/black"
            android:background="@null"
            android:hint="@string/map_order_can4" />

    </LinearLayout>

</LinearLayout>

java代码里怎么实现的

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.view.inputmethod.InputMethodManager;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.PopupWindow;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.qitong.qtcx.R;
import com.qitong.qtcx.interfaces.PopReturnListener;
/**
 * 取消订单,需要提供3-4个选项,还有一行输入框
 * @author chenling0418
 * 一组RadioGroup,一个单独的RadioButton
 * 单独的RadioButton的点击事件RadioGroup里也会收到
 * 这里组合使用,实现了 一点击RadioButton,输入框软键盘自动弹出,整个PopupWindow 上移
 */
public class CancleOrderPopup extends PopupWindow {
	
    private View view;
    @ViewInject(R.id.order_cancle_rg)
    private RadioGroup cancleRg;
    @ViewInject(R.id.order_cancle_rg_one)
    private RadioButton cancleRgOne;
    @ViewInject(R.id.order_cancle_rg_two)
    private RadioButton cancleRgTwo;
    @ViewInject(R.id.order_cancle_rg_three)
    private RadioButton cancleRgThree;
    @ViewInject(R.id.order_cancle_rg_four)
    private RadioButton cancleRgFour;
    @ViewInject(R.id.order_cancle_rg_four_content)
    private EditText cancleRgFourContent;
    @ViewInject(R.id.order_sure)
    private TextView orderSure;
    @ViewInject(R.id.order_cancle)
    private TextView orderCancle;
    
    private boolean isFourChecked;

    public CancleOrderPopup(Context context,PopReturnListener listener) {
        super(context);
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.map_order_cancle, null);
       
        initView(context,listener);
        
        initPop();

    }

	private void initView(final Context context,final PopReturnListener listener) {

		ViewUtils.inject(this, view); // 注入view和事件
		
		isFourChecked = false;
		
		cancleRgFour.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				
				cancleRgOne.setChecked(false);
				cancleRgTwo.setChecked(false);
				cancleRgThree.setChecked(false);
				isFourChecked = true;
				if(isChecked){
					//三个属性必须同时设置 EditText获取焦点  点击RadioButton时自动弹出软键盘
					cancleRgFourContent.setFocusable(true);
					cancleRgFourContent.setFocusableInTouchMode(true);   
					cancleRgFourContent.requestFocus(); 
					((InputMethodManager)cancleRgFourContent.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(cancleRgFourContent, 0);  
				}
				
			}
		});
		
		cancleRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
            @Override 
            public void onCheckedChanged(RadioGroup group, int checkedId) { 
            	
            	if(isFourChecked){
            		cancleRgFour.setChecked(false);
            		isFourChecked = false;
            		cancleRgFourContent.setText("");
            		((RadioButton)view.findViewById(checkedId)).setChecked(true);
            	}
            	
            } 
        }); 
		
		orderSure.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if(cancleRgFour.isChecked() ){
					if(TextUtils.isEmpty(cancleRgFourContent.getText())){
						Toast.makeText(context, "内容不可以为空", Toast.LENGTH_SHORT).show();
					}else{
						listener.messageListener(cancleRgFourContent.getText().toString());dismiss();
					}	
				}else{
					listener.messageListener( ((RadioButton)view.findViewById(cancleRg.getCheckedRadioButtonId())).getText().toString() );dismiss();
				}

			}
		});
		
		orderCancle.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				dismiss();
			}
		});
		
	}

	private void initPop() {
		//设置的View
        this.setContentView(view);
        //设置弹出窗体的宽
        this.setWidth(LayoutParams.MATCH_PARENT);
        //设置弹出窗体的高
        this.setHeight(LayoutParams.WRAP_CONTENT);
        //设置弹出窗体可点击
        this.setFocusable(true);
        //防止虚拟软键盘被弹出菜单遮住
        this.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
       
        //实例化一个ColorDrawable颜色为半透明
//        ColorDrawable dw = new ColorDrawable(0xb0000000);
        ColorDrawable dw = new ColorDrawable(Color.WHITE);
        
        //设置弹出窗体的背景
        this.setBackgroundDrawable(dw);
        //view添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框
        view.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {

                int height = view.findViewById(R.id.map_order_cancle_view).getTop();
                int y=(int) event.getY();
                if(event.getAction()==MotionEvent.ACTION_UP){
                    if(y<height){
                        dismiss();
                    }
                }
                return true;
            }
        });
	}
    
}

注解是使用了 xUtil,代码里不需要findViewById 了,

接口会调

public interface PopReturnListener {
	
	void messageListener(String message);
	
}

怎么使用popwindow

(new CancleOrderPopup(getActivity(),new PopReturnListener() {
				
				@Override
				public void messageListener(String message) {
					// 
					
					
				}
			})).showAtLocation(view.findViewById(R.id.fragment_baidumap), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置


有几个需要注意的地方,主动打开输入软件盘  private EditText cancleRgFourContent;

cancleRgFourContent.setFocusable(true);
					cancleRgFourContent.setFocusableInTouchMode(true);   
					cancleRgFourContent.requestFocus(); 
					((InputMethodManager)cancleRgFourContent.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(cancleRgFourContent, 0);  

得到值RadioGroup里被选中的RadioButton的值

((RadioButton)view.findViewById(cancleRg.getCheckedRadioButtonId())).getText().toString()



附录:xUtil: http://download.youkuaiyun.com/detail/i_do_can/9547427



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值