如何处理动作栏子菜单和PopupMenu上的长文本?

时间:2014-07-18 13:37:26

标签: android text android-actionbar multiline popupmenu

背景

我有an app显示应用列表,并有一个actionBar。其中一个actionBar项目有一个子菜单,显示了对屏幕上显示的列表进行排序的各种方法。

问题

我试图将应用程序翻译成希腊语,结果发现某些文本UI元素内部没有多行,这会导致文本被截断。

上下文菜单就是其中之一,所以我使用AlertDialog自己实现了它。

但是,我在actionBar子菜单上看到了同样的问题,我认为使用PopupMenu类时会出现同样的问题:

(查看子菜单中的第三项)

enter image description here

问题

有没有一种简单的方法可以解决这个问题,或者我应该自己实现它,就像我为上下文菜单所做的那样?

是否还有一种方法可以解决PopupMenu的这个问题?

为popupMenu添加样式(如图所示here)会有帮助吗?

如何使这些UI组件上使用的textView具有多行?

1 个答案:

答案 0 :(得分:0)

创建PopupWindow:

private ArrayAdapter<String> adapterTypeSelection;
private void popupWindow(View v, Point p) {

    // int popupwindowWidth =
    // UnitConverterClass.convertDpToPx(180,getActivity());
    int popupwindowHeight = LinearLayout.LayoutParams.WRAP_CONTENT;

    LayoutInflater layoutInflater = (LayoutInflater) getActivity()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View layout = layoutInflater.inflate(
            R.layout.dashboard_profile_popup_window, null);

    // Creating the PopupWindow
    final PopupWindow pwindow = new PopupWindow(getActivity());
    pwindow.setContentView(layout);
    // pwindow.showAsDropDown(v);
    // pwindow.setWidth(popupwindowWidth);
    pwindow.setHeight(popupwindowHeight);
    pwindow.setFocusable(true);

    String[] types = {"hello", "hi"};

    adapterTypeSelection = new ArrayAdapter<String>(getActivity(),
            R.layout.<your layout for the popupwindow>,
            R.id.textView, types);

    ListView listview = (ListView) pwindow.getContentView().findViewById(
            R.id.listview_popwindow);

    listview.setAdapter(adapterTypeSelection);

    listview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            TextView temp = (TextView) parent.getChildAt(position)
                    .findViewById(R.id.textView);

            if (temp.getText()
                    .toString()
                    .equals("hello"))) {
                //hello
            } else {
                //hi
            }

            pwindow.dismiss();
        }
    });

    pwindow.setOnDismissListener(new OnDismissListener() {

        @Override
        public void onDismiss() {
            //TODO dismiss settings
        }

    });

    pwindow.setWidth(<width>);
    pwindow.setBackgroundDrawable(<resource for background>);

    // int OFFSET_X = UnitConverterClass.convertDpToPx(180, getActivity());
    // int OFFSET_Y = UnitConverterClass.convertDpToPx(30, getActivity());
    // pwindow.showAtLocation(layout, Gravity.NO_GRAVITY, 
    //                                p.x + OFFSET_X, p.y + OFFSET_Y);
    pwindow.showAtLocation(layout, Gravity.NO_GRAVITY, p.x, p.y);
}

然后为按钮创建一个OnClickListener,如下所示:

actionBarButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            int[] location = new int[2];
            v.getLocationOnScreen(location);

            // Initialize the Point with x, and y positions
            Point point = new Point();
            point.x = location[0];
            point.y = location[1];

            popupWindow(v, point);

        }

    }
);

希望如果您真的想使用PopupWindow,这会有所帮助,但我仍然会在菜单上选择自定义布局。