android - 弹出式菜单正下方和按钮中心

标签 android popup

我目前正在制作一个包含一些数据的应用程序。我想在需要时编辑或删除它们。我创建了一个 PopUp 菜单,但问题是它出现在侧面,我希望它出现在单击按钮下方的中心。任何帮助将不胜感激。

这是我的 fragment Activity

public class TemporaryKeyFragment extends Fragment implements PopupMenu.OnMenuItemClickListener{

private ListView lvItems;
private List<Product> lstProducts;

DatabaseReference database;

private int mDisplayDays;
private int mDisplayHours;
private int mDisplayMinutes;
private int mDisplaySeconds;

SwipeRefreshLayout swipeRefreshLayout;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.activity_my_keys, container, false);

    lvItems = (ListView) view.findViewById(R.id.lvItems);

    SharedPreferences prefs = getActivity().getSharedPreferences(LOCK_PREFS, MODE_PRIVATE);

    database = FirebaseDatabase.getInstance().getReference("Generated_Keys/"+prefs.getString("deviceId", null));

    database.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot usershot : dataSnapshot.getChildren()){
                lstProducts.add(new Product(usershot.child("Username").getValue().toString(),Long.parseLong(usershot.child("RemainingTime").getValue().toString())));
            }
            lvItems.setAdapter(new CountdownAdapter(getActivity().getApplicationContext(), lstProducts));
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


    lstProducts = new ArrayList<>();

    swipeRefreshLayout = view.findViewById(R.id.swipe);

    lvItems.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            PopupMenu popupMenu = new PopupMenu(getActivity(),view,Gravity.CENTER);
            popupMenu.getMenuInflater().inflate(R.menu.popupmenu, popupMenu.getMenu());
            popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()) {
                        case R.id.edit:
                            Toast.makeText(getActivity().getApplicationContext(),"Edit Data ",Toast.LENGTH_LONG).show();
                            break;

                        case R.id.delete:
                            Toast.makeText(getActivity().getApplicationContext(),"Delete Data",Toast.LENGTH_LONG).show();
                            break;
                        default:
                            break;

                    }
                    return true;
                }
            });
            popupMenu.show();
            return true;
        }
    });



    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            database.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (!dataSnapshot.exists()){
                        new AlertDialog.Builder(getActivity())
                                .setTitle("No Keys")
                                .setMessage("There are no current generated keys")
                                .setIcon(android.R.drawable.ic_dialog_alert)
                                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int whichButton) {
                                        return;
                                    }})
                                .setNegativeButton(android.R.string.no, null).show();
                    }
                    for (DataSnapshot usershot : dataSnapshot.getChildren()){
                        lstProducts.add(new Product(usershot.child("Username").getValue().toString(),Long.parseLong(usershot.child("RemainingTime").getValue().toString())));
                    }
                    lvItems.setAdapter(new CountdownAdapter(getActivity().getApplicationContext(), lstProducts));
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    swipeRefreshLayout.setRefreshing(false);
                }
            },2000);
            lstProducts.clear();
        }
    });
    return view;

}

/**
 * This method will be invoked when a menu item is clicked if the item
 * itself did not already handle the event.
 *
 * @param item the menu item that was clicked
 * @return {@code true} if the event was handled, {@code false}
 * otherwise
 */
@Override
public boolean onMenuItemClick(MenuItem item) {
    return false;
}

private class Product {
    String name;
    long expirationTime;

    public Product(String name, long expirationTime) {
        this.name = name;
        this.expirationTime = expirationTime;
    }
}


public class CountdownAdapter extends ArrayAdapter<Product> {
    private LayoutInflater lf;
    private List<ViewHolder> lstHolders;
    private Handler mHandler = new Handler();
    private Runnable updateRemainingTimeRunnable = new Runnable() {
        @Override
        public void run() {
            synchronized (lstHolders) {
                Time nowTime = new Time(Time.getCurrentTimezone());
                nowTime.setToNow();
                nowTime.normalize(true);
                long nowMillis = nowTime.toMillis(true);
                for (ViewHolder holder : lstHolders) {
                    holder.updateTimeRemaining();
                }
            }
        }
    };

    public CountdownAdapter(Context context, List<Product> objects) {
        super(context, 0, objects);
        lf = LayoutInflater.from(context);
        lstHolders = new ArrayList<>();
        startUpdateTimer();
    }

    private void startUpdateTimer() {
        Timer tmr = new Timer();
        tmr.schedule(new TimerTask() {
            @Override
            public void run() {
                mHandler.post(updateRemainingTimeRunnable);
            }
        }, 1000, 1000);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = lf.inflate(R.layout.generated_list_item, parent, false);
            holder.tvProduct = (TextView) convertView.findViewById(R.id.tvProduct);
            holder.tvTimeRemaining = (TextView) convertView.findViewById(R.id.tvTimeRemaining);
            convertView.setTag(holder);
            synchronized (lstHolders) {
                lstHolders.add(holder);
            }
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.setData(getItem(position));

        return convertView;
    }
}

private class ViewHolder {
    TextView tvProduct;
    TextView tvTimeRemaining;
    Product mProduct;

    public void setData(Product item) {
        mProduct = item;
        tvProduct.setText(item.name);
        updateTimeRemaining();
    }

    public void updateTimeRemaining() {
        Time nowTime = new Time(Time.getCurrentTimezone());
        nowTime.setToNow();
        nowTime.normalize(true);
        long nowMillis = nowTime.toMillis(true);
        long timeDiff = mProduct.expirationTime - nowMillis;
        if (timeDiff > 0) {
            TemporaryKeyFragment.this.mDisplayDays = (int) (((timeDiff / 1000) / 86400));
            TemporaryKeyFragment.this.mDisplayHours = (int) (((timeDiff / 1000) - (TemporaryKeyFragment.this.mDisplayDays * 86400)) / 3600);
            TemporaryKeyFragment.this.mDisplayMinutes = (int) (((timeDiff / 1000) - ((TemporaryKeyFragment.this.mDisplayDays * 86400) + (TemporaryKeyFragment.this.mDisplayHours * 3600))) / 60);
            TemporaryKeyFragment.this.mDisplaySeconds = (int) ((timeDiff / 1000) % 60);
            tvTimeRemaining.setText(mDisplayDays + " days " + mDisplayHours + " hrs " + mDisplayMinutes+ " mins " + mDisplaySeconds + " sec");
        } else {
            tvTimeRemaining.setText("Expired!!");
        }
    }
}

我假设不需要布局,但如果需要,请在下面发表评论。非常感谢

最佳答案

PopupMenu popupMenu = new PopupMenu(getActivity(),view,Gravity.BOTTOM); 

并传递按钮 View 。

关于android - 弹出式菜单正下方和按钮中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51031743/

相关文章:

java - Android中的定时弹出

html - 在不改变视口(viewport)位置的情况下使用纯 CSS/HTML 弹出 div

function - 从弹出窗口调用后台函数

javascript - 如何从html弹出窗口返回值

android - 资源中图像的缩略图

android - Android 上的 Parse.com API PHP 后端和本地存储

java - Android PiP 模式和应用程序生命周期

Android 获取电池当前容量(单位为 mA)和电池总容量(单位为 mAh)

android - 即使关闭后也会弹出警报对话框

java - 无法在谷歌地图上自动显示当前位置?