欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android仿泡泡窗实现下拉菜单条实例代码

程序员文章站 2023-11-05 12:09:52
功能描述:点击下拉按钮,显示出所有的条目,有删除和点击功能,点击后将条目显示。 注意:泡泡窗默认是没有焦点的。要让泡泡窗获取到焦点。假如listview的item中有bu...

功能描述:点击下拉按钮,显示出所有的条目,有删除和点击功能,点击后将条目显示。

注意:泡泡窗默认是没有焦点的。要让泡泡窗获取到焦点。假如listview的item中有button,imagebutton,checkbox等会强制获取焦点的view 此时,listview的item无法获取焦点,从而无法被点击 解决方法:给item的根布局增加以下属性 android:descendantfocusability="blocksdescendants"设置之后,button获取焦点,item中其他控件也可以获取焦点,如果文本的文字过多,会被后面的图标盖住,首先设置单行android:singleline="true"再设置右边距就盖不住android:padding="40dp"

需要添加下面三项

//让泡泡窗额度条目获取到焦点 
    popupwindow.setfocusable(true); 
    //设置背景图 
    popupwindow.setbackgrounddrawable(new bitmapdrawable()); 
    popupwindow.setoutsidetouchable(true); 

主布局文件activity_main.xml

<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" 
  android:background="#22000000" 
  tools:context=".mainactivity" > 
  <relativelayout  
    android:layout_margintop="40dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerhorizontal="true" 
    > 
  <edittext 
    android:id="@+id/et" 
    android:singleline="true" 
    android:padding="40dp" 
    android:layout_width="300dp" 
    android:layout_height="40dp" 
    /> 
  <imageview  
    android:layout_width="wrap_content" 
    android:layout_height="40dp" 
    android:id="@+id/iv_select" 
    android:layout_centervertical="true" 
    android:background="@drawable/ic_launcher" 
    android:layout_alignright="@id/et" 
    /> 
  </relativelayout> 
</relativelayout> 

每一个条目的布局文件item_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:padding="5dp" 
  android:orientation="horizontal" > 
  <textview  
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:drawableleft="@drawable/ic_launcher" 
    android:gravity="center_vertical" 
    android:drawablepadding="3dp" 
    android:text="123" 
    android:id="@+id/tv_number" 
    android:layout_weight="1" 
    /> 
  <imageview  
    android:id="@+id/iv_delete" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/ic_launcher" 
    /> 
</linearlayout> 

逻辑代码mainactivity.java

package com.ldw.select; 
import java.util.arraylist; 
import android.app.activity; 
import android.graphics.drawable.bitmapdrawable; 
import android.os.bundle; 
import android.view.view; 
import android.view.view.onclicklistener; 
import android.view.viewgroup; 
import android.widget.adapterview; 
import android.widget.adapterview.onitemclicklistener; 
import android.widget.baseadapter; 
import android.widget.edittext; 
import android.widget.imageview; 
import android.widget.listview; 
import android.widget.popupwindow; 
import android.widget.textview; 
public class mainactivity extends activity implements onclicklistener{ 
  private imageview iv_select; 
  private edittext et; 
  private arraylist<string> list = new arraylist<string>(); 
  private textview tv_number; 
  private imageview iv_delete; 
  private listview listview; 
  private popupwindow popupwindow; 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    initview(); 
    initlistener();  
    initdata(); 
  } 
  private void initview() { 
    setcontentview(r.layout.activity_main); 
    iv_select = (imageview) findviewbyid(r.id.iv_select); 
    et = (edittext) findviewbyid(r.id.et); 
  } 
  private void initlistener() { 
    iv_select.setonclicklistener(this); 
  } 
  //集合中添加数据 
  private void initdata() { 
    for(int i = 0; i< 20; i++){ 
      list.add(1340000000 + i + ""); 
    } 
    initlistview(); 
  } 
  //初始化列表 
  private void initlistview(){ 
    listview = new listview(this); 
    //设置listview的背景图 
    listview.setbackgroundresource(r.drawable.ic_launcher); 
    //让listview的滚动条不可见 
    listview.setverticalscrollbarenabled(false); 
    myadapter adapter = new myadapter(); 
    listview.setadapter(adapter); 
    listview.setonitemclicklistener(new onitemclicklistener(){ 
      @override 
      public void onitemclick(adapterview<?> parent, view view, 
          int position, long id) { 
        et.settext(list.get(position)); 
        //关闭泡泡窗 
        popupwindow.dismiss(); 
      } 
    }); 
  } 
  //泡泡窗实现点击显示列表,泡泡窗默认是不获取焦点的 
  private void shownumberlist(){ 
    if(popupwindow == null){ 
    //泡泡窗的填充,设置宽高 
    popupwindow = new popupwindow(listview, et.getwidth(), 300); 
    } 
    //让泡泡窗额度条目获取到焦点 
    popupwindow.setfocusable(true); 
    //设置背景图 
    popupwindow.setbackgrounddrawable(new bitmapdrawable()); 
    popupwindow.setoutsidetouchable(true); 
    //第一个参数是依附哪一个参数下,x轴,y轴的偏移量,相对于第一个参数的左下角的位置 
    popupwindow.showasdropdown(et, 0, 0); 
  } 
  @override 
  public void onclick(view v){ 
    switch (v.getid()){ 
      case r.id.iv_select: 
        //点击弹出列表 
        shownumberlist(); 
        break; 
    } 
  } 
  //listview填充 
  class myadapter extends baseadapter{ 
    @override 
    public int getcount() { 
      return list.size(); 
    } 
    @override 
    public object getitem(int position) { 
      return null; 
    } 
    @override 
    public long getitemid(int position) { 
      return 0; 
    } 
    @override 
    public view getview(final int position, view convertview, viewgroup parent) { 
      final view view = view.inflate(mainactivity.this, r.layout.item_list, null); 
      tv_number = (textview) view.findviewbyid(r.id.tv_number); 
      iv_delete = (imageview) view.findviewbyid(r.id.iv_delete); 
      tv_number.settext(list.get(position)); 
      //删除按键 
      iv_delete.setonclicklistener(new onclicklistener(){ 
        @override 
        public void onclick(view v) { 
          //删除条目 
          list.remove(position); 
          //更新页面 
          notifydatasetchanged(); 
          //根据当前条目的个数设置,当前条目的高度 
          int listviewheight = list.size() * view.getheight(); 
          if(listviewheight > 300){ 
            listviewheight = 300; 
          }else{ 
            listviewheight = listviewheight; 
          } 
          //更新泡泡窗的高度 
          popupwindow.update(et.getwidth(), listviewheight); 
          //删除完了,泡泡窗小消失 
          if(list.size() == 0){ 
            popupwindow.dismiss(); 
            //下拉条消失 
            iv_select.setvisibility(view.gone); 
          } 
        } 
      }); 
      return view; 
    } 
  } 
} 

以上所述是小编给大家介绍的android仿泡泡窗实现下拉菜单条实例代码,希望对大家有所帮助