【问题标题】:How do I replace my popupmenu code with ListPopupWindow?如何用 ListPopupWindow 替换我的 popupmenu 代码?
【发布时间】:2017-04-24 16:13:10
【问题描述】:

目前,我正在以编程方式创建一个弹出菜单,其中显示楼层列表和标题。但是,仅更改标题的背景颜色并在标题中添加关闭按钮是一场噩梦。

我想用列表弹出窗口替换这个弹出菜单,这样我就可以添加一个带有背景属性的 XML 文件,标题为黑色,背景为黑色,右侧为关闭按钮,菜单中的项目为白色背景。有没有办法通过列表弹出窗口来实现这一点?这是我的代码:

private void floorMenu(ImageView btnFloorMenu){
    MapData data = new MapDao(MyPlugin.mapId);
    final List<Floor> flList = dao.getFloors();
    // set popupMenu
    final PopupMenu floorsPm = new PopupMenu(MapViewActivity.this,btnFloorMenu);

    MenuItem titleItem =  floorsPm.getMenu().add(Menu.NONE, Menu.NONE, Menu.NONE, "Floors");

    int i = 1;
    for(Floor fl : flList)
    {
        floorsPm.getMenu().add(Menu.NONE, i,i, fl.getName());
        if(i>3)
            break;
        i++;
    }


    // add popup listener
    floorsPm.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        //    onClick
        @Override
        public boolean onMenuItemClick(MenuItem item){
            //       get floorname

            int flOrder = item.getOrder();
            if(flOrder == Menu.NONE )
                return true;
            flOrder--;

            final String floorId = flList.get(flOrder).getMapId();

            //       set camera to floor

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    floorsPm.dismiss();
                    mapFragment.getMapManager().setCameraLayer(floorId, false);
                     Log.d(TAG, "post cameraLayer set");
                    changedSteps = true;
                    pauseNav();

                }
            });




            return true;
        }

    });
    floorsPm.show();


}

【问题讨论】:

  • ListPopupWindow 由 ListView 提供支持,几乎不提供自定义功能。您可以找到here 一个可以托管任何视图的弹出窗口。只需致电setView(view)show()

标签: android popup popupwindow popupmenu android-popupwindow


【解决方案1】:

这是我创建显示ListPopupWindow的示例

首先,为ListPopupWindow的每一项创建布局item_list_popup_window

<?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="wrap_content"
    android:background="#e4e4e4"
    android:paddingTop="1dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/text_title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1" />

    <Button
        android:id="@+id/button_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Delete" />

</LinearLayout>

其次,为您的ListPopupWindow 点赞创建Adapter

public class ListPopupWindowAdapter extends BaseAdapter{
    private Activity mActivity;
    private List<String> mDataSource = new ArrayList<>();
    private LayoutInflater layoutInflater;
    private OnClickDeleteButtonListener clickDeleteButtonListener;

    ListPopupWindowAdapter(Activity activity, List<String> dataSource, @NonNull OnClickDeleteButtonListener clickDeleteButtonListener){
        this.mActivity = activity;
        this.mDataSource = dataSource;
        layoutInflater = mActivity.getLayoutInflater();
        this.clickDeleteButtonListener = clickDeleteButtonListener;
    }

    @Override
    public int getCount() {
        return mDataSource.size();
    }

    @Override
    public String getItem(int position) {
        return mDataSource.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null){
            holder = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.item_list_popup_window, null);
            holder.tvTitle = (TextView) convertView.findViewById(R.id.text_title);
            holder.btnDelete = (Button) convertView.findViewById(R.id.button_delete);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        // bind data
        holder.tvTitle.setText(getItem(position));
        holder.btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clickDeleteButtonListener.onClickDeleteButton(position);
            }
        });
        return convertView;
    }

    public class ViewHolder{
        private TextView tvTitle;
        private Button btnDelete;
    }

    // interface to return callback to activity
    public interface OnClickDeleteButtonListener{
        void onClickDeleteButton(int position);
    }
}

第三,你创建一个函数来创建和显示ListPopupWindow

private void showListPopupWindow(View anchorView) {
    final ListPopupWindow listPopupWindow = new ListPopupWindow(this);
    listPopupWindow.setWidth(600);
    List<String> sampleData = new ArrayList<>();
    sampleData.add("A");
    sampleData.add("B");
    sampleData.add("CCCCCCCCCCCCCC");
    sampleData.add("D");
    sampleData.add("EEEEEEEEE");

    listPopupWindow.setAnchorView(anchorView);
    ListPopupWindowAdapter listPopupWindowAdapter = new ListPopupWindowAdapter(this, sampleData, new ListPopupWindowAdapter.OnClickDeleteButtonListener() {
        @Override
        public void onClickDeleteButton(int position) {
            Toast.makeText(MainActivity.this, "Click delete " + position, Toast.LENGTH_SHORT).show();
            listPopupWindow.dismiss();
        }
    });
    listPopupWindow.setAdapter(listPopupWindowAdapter);
    listPopupWindow.show();
}

最后,您可以通过

显示ListPopupWindow
showListPopupWindow(v);

例如,如果您想在单击按钮时显示它

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

Full Demo is here

【讨论】:

  • 该解决方案看起来不错,将对其进行测试。您能否也根据我的代码对其进行修改,并告诉我如何修改弹出窗口以从左侧滑入?
  • 这仍然不是我想要的,但因为你是第一个为你回答 50 分的人
【解决方案2】:

请试试这个代码,也许你不会喜欢这个

private void floorMenu(ImageView btnFloorMenu){
final Dialog customDialog = new Dialog(this);
customDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
customDialog.setContentView(R.layout.item_dialog_coustom_design);

TextView clickItem = (TextView)customDialog.findViewById(R.id.item_click);
TextView clickItem1 = (TextView)customDialog.findViewById(R.id.item_click1);
TextView clickItem2 = (TextView)customDialog.findViewById(R.id.item_click2);
Button btnClose = (Button)customDialog.findViewById(R.id.btn_close);

clickItem.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        customDialog.dismiss();
        // wright your Button Action
    }
});

clickItem1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        customDialog.dismiss();
        // wright your Button Action
    }
});

clickItem2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        customDialog.dismiss();
        // wright your Button Action
    }
});

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

}

创建线性布局 layout_width="280dp" layout_height="wrap_content" android:orientation="vertical" 文件名 item_dialog_coustom_design.xml 然后把这段代码放上去

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Your Title"
        android:background="#000"
        android:textColor="#fff"
        android:padding="12dp"
        android:textSize="20sp"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="1dp"
        android:background="#fff"
        android:padding="10dp"
        android:text="Your Item"
        android:id="@+id/item_click"
        android:textSize="16sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="1dp"
        android:background="#fff"
        android:padding="10dp"
        android:text="Your Item"
        android:id="@+id/item_click1"
        android:textSize="16sp" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="1dp"
        android:background="#fff"
        android:padding="10dp"
        android:text="Your Item"
        android:id="@+id/item_click2"
        android:textSize="16sp" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:paddingRight="10dp"
        android:paddingBottom="10dp"
        android:background="#fff"
        android:gravity="right">
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/btn_close"
                android:text="Close"/>
    </LinearLayout>

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多