Подпълването на ActionBar DropDown причинява празно пространство [пейзажен режим]

В момента имам следния style.xml

АКТУАЛИЗИРАНО – Включени са всички подходящи стилове

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="actionBarStyle">@style/MyActionBarStyle</item>
    <item name="actionDropDownStyle">@style/MyDropDownStyle</item>
</style>
<style name="MyActionBarStyle" parent="Widget.AppCompat.ActionBar.Solid">
    <item name="android:actionBarDivider">@null</item>
    <item name="background">@drawable/logo</item>
    <item name="displayOptions">showHome</item>
</style>
<style name="MyDropDownStyle" parent="Base.Widget.AppCompat.Spinner.DropDown.ActionBar">
    <item name="android:paddingLeft">240dp</item>
    <item name="android:dropDownHorizontalOffset">240dp</item>
    <item name="android:background">@android:color/transparent</item>
</style>

Това ми позволява да настроя да преместя DropDown 240dp далеч от неговата ос X, което работи доста добре. Вижте екранна снимка #1

Екранна снимка №1 въведете описание на изображението тук

Но като страничен ефект тази подложка причинява празно "пространство" от дясната страна на самия изскачащ прозорец. Вижте екранна снимка #2

Екранна снимка №2 въведете описание на изображението тук

Как мога да задам фиксиран размер на изскачащия прозорец или да игнорирам подложката, зададена от стила DropDown?

АКТУАЛИЗИРАНО

Причината за paddingLeft е да не се припокрива с логото (дефинирано като фон)

<item name="background">@drawable/logo</item>

АКТУАЛИЗАЦИЯ 2 – Екранна снимка без стил dropDownHorizontalOffset

въведете описание на изображението тук

PS:

dropDownHorizontalOffset се използва само за задаване на оста X на изскачащия прозорец, за да съответства на paddingLeft


person Ole K    schedule 11.06.2015    source източник
comment
Въпреки че не разбирам защо бихте искали такива подложки, изскачащото меню не трябва да е така. Публикувайте още код, свързан с него, за да можем да помогнем (стилове и т.н.). Ами ако премахнете android:dropDownHorizontalOffset?   -  person shkschneider    schedule 11.06.2015
comment
Е, вече забелязах, че разработката за Android е разработка без бариери. Почти съм сигурен, че трябва само да знам как да задам стила на изскачащия прозорец (като ширина), за да реша проблема - Някакви предложения?   -  person Ole K    schedule 11.06.2015
comment
Съжалявам, нямам представа как се озовахте с изскачащо меню вляво... Използвате AppCompat? Лента с инструменти? Някаква основна тема?   -  person shkschneider    schedule 11.06.2015
comment
Този изскачащ прозорец е поведение по подразбиране на темата AppCompat, когато има по-малко място за разделите Imo - не съм добавил никакви допълнителни оформления   -  person Ole K    schedule 11.06.2015
comment
Не е ли отхвърлен падащият селектор/раздели с AppCompat? Вярвам, че е така. Не знам решение за това, съжалявам.   -  person shkschneider    schedule 12.06.2015
comment
Е, мисля, че е така, но често е по-лесно да запазя стари неща, отколкото да работя върху нови неща - сега ще го променя, за да използвам лентата с инструменти, която трябва да ми позволи да добавя въртяща се лента с персонализирана ширина и т.н.   -  person Ole K    schedule 12.06.2015


Отговори (1)


Възможно заобиколно решение е да замените ActionBar с новата лента с инструменти (android.support.v7.widget.Toolbar) и да добавите Spinner (DropDown) точно вътре в нея

Редовете на кода са променени за по-добра илюстрация и не са тествани

main_activity.xml

<LinearLayout
    android:orientation="vertical"
    android:background="@color/navigationBar"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">

        <android.support.v7.widget.Toolbar
            android:background="@drawable/logo"
            android:id="@+id/toolbar"
            android:layout_height="wrap_content"
            android:layout_width="match_parent">
            <Spinner
                android:layout_marginLeft="240dp"
                android:id="@+id/spinner"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </android.support.v7.widget.Toolbar>
</LinearLayout>

MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    //toolbar.setLogo(R.drawable.logo);

    setupSpinnerTabs();

    // for device orientation purpose
    displaySpinner(getResources().getConfiguration().orientation);
}

private void setupSpinnerTabs() {
    ToolbarSpinnerAdapter adapter = new ToolbarSpinnerAdapter(toolbar.getContext());

    spinner = (Spinner)findViewById(R.id.spinner);
    spinner.setAdapter(adapter);
    // the below is used for the selection "change event" of the spinner
    //spinner.setOnItemSelectedListener(new SpinnerSelection());
}

ToolbarSpinnerAdapter.java

public class ToolbarSpinnerAdapter extends BaseAdapter implements SpinnerAdapter {
    Context context;

    ToolbarSpinnerAdapter(Context ctx) {
        context = ctx;
    }

    @Override
    public int getCount() {
        return 1;
    }

    @Override
    public Object getItem(int position) {
        return "Spinner here"
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View defaultView = getLayoutInflater().inflate(R.layout.your_spinner_dropdown_layout, null);
        // [...]

        text.setText( this.getItem(position).toString() );
        return defaultView;
    }
}

Резултатът трябва да изглежда доста подобен на изображението по-долу:

въведете описание на изображението тук

PS: В портретна ориентация може да няма достатъчно място за Spinner

person Ole K    schedule 12.06.2015