удалите прописку вокруг значка действия слева на Android 4.0+

Я хочу удалить прокладку вокруг значка слева в стандартной панели действий android 4.0+. Я устанавливаю значок с помощью:

getActionBar().setIcon(getResources().getDrawable(R.drawable.ic_action_myapp)); 

И я хотел бы, чтобы значок заполнил вертикально пространство, касаясь как сверху, так и снизу, похожего на то, что делает приложение soundcloud:

    Копаясь в источниках AOSP, кажется, что этот код связан с com.android.internal.widget.ActionBarView.java . В частности, соответствующей частью является метод onLayout() внутреннего classа ActionBarView$HomeView , частично описанный ниже (строки 1433-1478):

      @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { ... final LayoutParams iconLp = (LayoutParams) mIconView.getLayoutParams(); final int iconHeight = mIconView.getMeasuredHeight(); final int iconWidth = mIconView.getMeasuredWidth(); final int hCenter = (r - l) / 2; final int iconTop = Math.max(iconLp.topMargin, vCenter - iconHeight / 2); final int iconBottom = iconTop + iconHeight; final int iconLeft; final int iconRight; int marginStart = iconLp.getMarginStart(); final int delta = Math.max(marginStart, hCenter - iconWidth / 2); if (isLayoutRtl) { iconRight = width - upOffset - delta; iconLeft = iconRight - iconWidth; } else { iconLeft = upOffset + delta; iconRight = iconLeft + iconWidth; } mIconView.layout(iconLeft, iconTop, iconRight, iconBottom); } 

    тот же виджет использует этот макет, определенный в res/layout/action_bar_home.xml :

         

    Согласно источникам, значок отображается в Imageview с id = android.R.id.home . onLayout() выше метод onLayout() учитывает поля ImageView определенные в макете, которые нельзя установить с помощью переопределения темы / стиля, поскольку они используют значение @android:dimen/action_bar_icon_vertical_padding .

    Все, что вы можете сделать, это избавиться от этих значений во время выполнения и установить их в соответствии с вашими потребностями: просто ImageView и установите его верхнее и нижнее поля на 0 . Что-то вроде этого:

     ImageView icon = (ImageView) findViewById(android.R.id.home); FrameLayout.LayoutParams iconLp = (FrameLayout.LayoutParams) icon.getLayoutParams(); iconLp.topMargin = iconLp.bottomMargin = 0; icon.setLayoutParams( iconLp ); 

    EDIT: Я только что понял, что я не рассказывал, как избавиться от левой прокладки. Решение ниже.

    На панели слева на панели действия влияет поведение значка панели задач. Когда это отключено (через ActionBar.setDisplayHomeAsUpEnabled(false) ), индикатор слева / вверх исчез, но также используется левое дополнение. Простое решение:

    1. активировать навигацию над панелью действий с помощью ActionBar.setDisplayHomeAsUpEnabled(true) , чтобы рассмотреть представление индикатора в процессе компоновки
    2. принудительно использовать drawable в качестве индикатора вверх в ваших res/values-v14/styles.xml для null

    например:

      

    Я нашел другое разрешение (ссылка appcompat-v7), которые изменяют toolbarStyle, следующий код:

     @style/Widget.Toolbar  

    использовать пользовательский макет для ActionBar

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

     public class TestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final ActionBar actionBar = getActionBar(); actionBar.setCustomView(R.layout.actionbar_custom_view_home); actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowCustomEnabled(true); actionBar.setDisplayUseLogoEnabled(false); actionBar.setDisplayShowHomeEnabled(false); setContentView(R.layout.main); } public void Click(View v) { if (v.getId() == R.id.imageIcon) { Log.e("click on--> ", "Action icon"); } } } 

    actionbar_custom_view_home.xml

         

    Улучшенный ответ parrzhang в удалении дополнений вокруг значка действия слева на Android 4.0+

      private void adjustHomeButtonLayout(){ ImageView view = (ImageView)findViewById(android.R.id.home); if(view.getParent() instanceof ViewGroup){ ViewGroup viewGroup = (ViewGroup)view.getParent(); View upView = viewGroup.getChildAt(0); if(upView != null && upView.getLayoutParams() instanceof FrameLayout.LayoutParams){ FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) upView.getLayoutParams(); layoutParams.width = 20;// **can give your own width** upView.setLayoutParams(layoutParams); } } } 

    Чтобы установить высоту ActionBar, вы можете создать новую тему, подобную этой:

         

    и установите эту тему в свою деятельность:

    Android: тема = “@ стиль / Theme.BarSize”

    Теперь задайте высоту значков "match_parent" .

    Это позволит удалить верхнее и нижнее дополнение.

    Теперь стрелка слева встроена в структуру, поэтому у вас есть два варианта обходного пути:

    1. Используйте ActionBarSherlock. Он использует свои собственные drwables и ресурсы, поэтому вы можете изменить значок стрелки на emty png, чтобы ваш значок вверх переместился в крайнее левое.

    2. Значок «вверх / назад» возникает из:

     public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } } 

    Таким образом, вместо того, чтобы использовать эту опцию для кнопки «вверх», вы можете сделать еще один вариант панели действий, который имеет намерение для предыдущего действия, а затем поместить этот значок в панель действий.

    Однако это будет более сложным решением.

    Надеюсь, это поможет.. 🙂

    вы можете найти homeview в actionbarview так:

        

    но вы не можете получить upView с помощью findViewById(android.R.id.up) .

    так что вы можете получить homeView и получить его родительский вид, установить ширину обзора 0

      ImageView view = (ImageView)findViewById(android.R.id.home); if(view.getParent() instanceof ViewGroup){ ViewGroup viewGroup = (ViewGroup)view.getParent(); View upView = viewGroup.getChildAt(0); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) upView.getLayoutParams(); layoutParams.width = 0; upView.setLayoutParams(layoutParams); } 
    Давайте будем гением компьютера.