Подтвердить что ты не робот

Как настроить Android ActionBar для отображения пользовательского представления перед вкладками?

Я использую пользовательский вид для ActionBar с вкладками. Моя проблема - упорядочение пользовательского представления. Android отображает ПОСЛЕ вкладки, которые я не хочу.

Я хочу, чтобы пользовательский вид отображал ДО вкладки.

Есть ли способ настроить actionBar для отображения пользовательского представления перед вкладками? или это невозможно?

код:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    View customActionBarView = 
        getLayoutInflater().inflate(R.layout.home_actionbar, null, true);
    ActionBar.LayoutParams lp = 
        new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT, 
            LayoutParams.WRAP_CONTENT);

    lp.gravity = Gravity.START;
    bar.setCustomView(customActionBarView, lp);
    bar.setLogo(R.drawable.logo);
    bar.setHomeButtonEnabled(true);
    bar.setDisplayShowCustomEnabled(true);

    bar.addTab(bar.newTab()
        .setText("Stuff")
        .setTabListener(new TabListener<StuffFragment>(
            this, "stuff", StuffFragment.class)));

    bar.addTab(bar.newTab()
        .setText("Friends")
        .setTabListener(new TabListener<ContactsFragment>(
            this, "friends", ContactsFragment.class)));

    bar.addTab(bar.newTab()
        .setText("Messages")
        .setTabListener(new TabListener<ConversationsFragment>(
            this, "messages", ConversationsFragment.class)));

    if (savedInstanceState != null) {
        bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
    }

    bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | 
        ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO);

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);    
}

enter image description here

4b9b3361

Ответ 1

Это похоже на предполагаемое поведение при использовании вкладок и пользовательских представлений. https://code.google.com/p/android/issues/detail?id=36191#c3

Если вы посмотрите на ActionBarSherlock - вкладки, отображающие ВЫШЕ действующую панель действий с пользовательским представлением, многие другие люди тоже это испытывают, и некоторые люди предлагают решения.

Мне не удалось получить какие-либо решения, но они могут работать на вас. Трюк, похоже, заключается в том, чтобы убедиться, что логотип не установлен для скрытия. Позвоните
  getActionBar().setDisplayShowHomeEnabled(true) или getSupportActionBar().setDisplayShowHomeEnabled(true) при использовании ActionBarSherlock.

Затем вызовите:

View homeIcon = findViewById(
    Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
    android.R.id.home : R.id.abs__home);
((View) homeIcon.getParent()).setVisibility(View.GONE);
((View) homeIcon).setVisibility(View.GONE);

Это даст ссылку на представление панели действий, содержащее логотип, и запустит его, чтобы пользовательский вид заполнил весь родительский вид, но должен держать вкладки внизу...

Как я уже сказал, я не смог добиться этого, но некоторые люди добились успеха.

Удачи.

Ответ 2

У меня была та же проблема, и я понял, как ее решить. Это не "изящное" решение, но это было лучшее, что я мог найти. Прежде всего, поскольку вы хотите изменить стандартное поведение ActionBar, вы должны заставить ActionBar Sherlok всегда использовать не-родную реализацию. Для этого откройте ActionBarSherlok.java и прокомментируйте эту строку кода:

registerImplementation(ActionBarSherlockNative.class);

затем удалите все значения-v11 values-v14 и т.д. и обязательно продолжайте тему Theme.Sherlock и никогда Theme.Holo

На этом этапе вы уверены, что реализация ActionBar всегда такова, написанная Джейком Уортоном. Осталось только сделать макет вида ActionBar так, как вы хотите. Откройте ActionBarView.java и в методе onLayout() переместите этот фрагмент кода

 if (mExpandedActionView == null) { 
        final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE &&
                (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0;
        if (showTitle) {
            x += positionChild(mTitleLayout, x, y, contentHeight);
        }

        switch (mNavigationMode) {
            case ActionBar.NAVIGATION_MODE_STANDARD:
                break;
            case ActionBar.NAVIGATION_MODE_LIST:
                if (mListNavLayout != null) {
                    if (showTitle) x += mItemPadding;
                    x += positionChild(mListNavLayout, x, y, contentHeight) + mItemPadding;
                }
                break;
            case ActionBar.NAVIGATION_MODE_TABS:
                if (mTabScrollView != null) {
                    if (showTitle) x += mItemPadding;
                    x += positionChild(mTabScrollView, x, y, contentHeight) + mItemPadding;
                }
                break;
        }
    }

прямо перед этой частью

if (mProgressView != null) {
        mProgressView.bringToFront();
        final int halfProgressHeight = mProgressView.getMeasuredHeight() / 2;
        mProgressView.layout(mProgressBarPadding, -halfProgressHeight,
                mProgressBarPadding + mProgressView.getMeasuredWidth(), halfProgressHeight);
    }

Вы закончили! Надеюсь, что это поможет

Ответ 3

При добавлении пользовательского вида в ActionBar вы также можете указать гравитацию.

ActionBar.LayoutParams lp = new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);              
lp.gravity = Gravity.LEFT;
customView.setLayoutParams(lp);

Ответ 4

используйте ActionBarSherlock, что является очень хорошей реализацией Custom ActionBar для всех версий Android и очень прост в использовании.

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

Ответ 5

Вы создаете приложение для планшета? Насколько я знаю, панель вкладок панели действий в основном появляется под ней на сотовом телефоне.
Если на планшете, я боюсь, вы не можете настроить позиции вкладок. я могу подумать, что вам нужно выйти из режима навигации и создать пользовательский вид, который выглядит как вкладки для замены вкладок actionBar. Конечно, это вызывает много дополнительных усилий для работы с навигационными материалами.

Ответ 6

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

Единственным недостатком этого решения является то, что вам нужно будет поддерживать состояние задней кнопки самостоятельно (если вы ее вообще используете)

Ответ 7

Сначала установите свойство DisplayShowHomeEnabled для панели действий в значение "true":       actionBar.setDisplayShowHomeEnabled(истина);

а затем:

    View homeIcon = findViewById(android.R.id.home);
        ((View) homeIcon.getParent()).setVisibility(View.GONE);
        ((View) homeIcon).setVisibility(View.GONE);

Надеюсь, это поможет:)