Как обрабатывать длинный текст в подменю панели действий и в PopupMenu?

Задний план

У меня есть приложение который показывает список приложений и имеет панель действий. один из элементов панели действий имеет подменю, в котором показаны различные способы сортировки списка, отображаемого на экране.

Эта проблема

Я пытаюсь сделать так, чтобы приложение переводилось на греческий язык, и оказалось, что некоторые текстовые элементы пользовательского интерфейса не имеют внутри себя многострочного текста, из-за чего текст становится усеченным.

Контекстное меню является одним из них, поэтому я сделал свою собственную реализацию с помощью AlertDialog.

Однако я вижу ту же проблему в подменю actionBar и думаю, что та же проблема возникает при использовании PopupMenu класс:

(смотрите третий пункт в подменю)

введите здесь описание изображения

Вопрос

Есть ли простой способ решить эту проблему, или я должен сделать свою собственную реализацию, как я сделал для контекстного меню?

Есть ли способ решить эту проблему для PopupMenu?

Поможет ли добавление стиля для popupMenu (как показано здесь)?

Как сделать текстовые представления, используемые в этих компонентах пользовательского интерфейса, многострочными?


person android developer    schedule 18.07.2014    source источник
comment
Вы можете изменить стиль этого меню, чтобы изменить размер текста с помощью опции textSize. Итак, я думаю, что если вы уменьшите размер текста, он не будет обрезан.   -  person luiscosta    schedule 18.07.2014
comment
@Akagami Я не хочу уменьшать размер текста. Я просто хочу сделать его многострочным по мере необходимости.   -  person android developer    schedule 18.07.2014
comment
@android_developer Я думаю, вам нужно создать собственный макет для этого. См. эту ссылку: stackoverflow.com/questions/14868774/   -  person luiscosta    schedule 18.07.2014
comment
@Akagami Может быть, я мог бы использовать класс PopupMenu и дублировать все из подменю actionBar, но вместо этого использовать многострочный? Является ли это возможным? Я не могу понять, как этого добиться... Может быть, вместо этого мне следует использовать PopupWindow?   -  person android developer    schedule 19.07.2014
comment
@android_developer Я бы выбрал собственный макет, но я опубликовал ответ для PopupWindow. Проверьте это, если вы решите использовать один!   -  person luiscosta    schedule 21.07.2014


Ответы (1)


Создание всплывающего окна:

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, но я бы все же выбрал пользовательский макет в меню.

person luiscosta    schedule 21.07.2014
comment
эммм.... содержание было правильным, но имя не было. Я сейчас удалил пост. вот содержание: Интересно. К сожалению, я не могу сделать это прямо сейчас, так как у меня призыв в армию (я из Израиля), так что я надеюсь не забыть вернуться к этому когда-нибудь в будущем. Спасибо. - person android developer; 28.07.2014