24

Я использую библиотеку Showcase, чтобы объяснить мою функцию приложения для пользователя . В какой-то момент мне нужно сгладить все ActionBar, чтобы представить еще одну функцию пользователю.Как получить представление ActionBar?

Для этого я использую setAlpha(float num) класса View. И так делать, что мне нужно, чтобы получить фактический вид экземпляр моего ActionBar

И, кстати, я использую support-7-appcompat библиотеку, которая дает поддержку ActionBar для старых систем.

UPDATE:

В то же время я нашел этот вариант, если настроить пользовательский вид и добавить его к вам ActionBar с помощью:

getSupportActionBar().setCustomView(v); 

Тогда, чтобы получить View от ActionBar вас мог бы сделать:

(View) activity.getSupportActionBar().getCustomView().getParent().getParent() 

Но я думаю, что должен быть сим pler и более простой способ сделать это.

Кто-нибудь это знает?

Заранее благодарен.

ответ

46

Да. Вы действительно можете получить вид с помощью этой функции:

public View getActionBarView() { 
    Window window = getWindow(); 
    View v = window.getDecorView(); 
    int resId = getResources().getIdentifier("action_bar_container", "id", "android"); 
    return v.findViewById(resId); 
} 

Практически так это работает в том, что контейнер ActionBar использует идентификатор android.R.id.action_bar_container, но этот идентификатор не является публичным. Поэтому мы используем getIdentifier() для извлечения этого идентификатора, а затем все просто.

+0

Да, это работает. Большое спасибо. –

+2

Что делать, если я использую actionbarsherlock? –

+1

@ThuyTrinh Я думаю, что его 'abs__action_bar_container'for actionbarsherlock –

4

Я сделал небольшое исправление на @idunnololz код для поддержки ActionBarSherlock

private View getActionBarView() { 

    int actionViewResId = 0; 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
     actionViewResId = getResources().getIdentifier(
       "abs__action_bar_container", "id", getPackageName()); 
    } else { 
     actionViewResId = Resources.getSystem().getIdentifier(
       "action_bar_container", "id", "android"); 
    } 
    if (actionViewResId > 0) { 
     return this.findViewById(actionViewResId); 
    } 

    return null; 
} 
+0

Он возвращает null, если я использую 'action_bar_container', хотя я использую' ActionBarActivity' из 'appcompat-v7' (r21.0.3). Я проверил и нашел, что 'actionViewResId' возвращает положительное значение. – IronBlossom

+0

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

+0

На самом деле мне нужно добавить максимальную строку в TextBar Title TextView, но 'this.findViewById (actionViewResId)' возвращает null. Я даже использовал 'getWindow(). GetDecorView()' вместо 'this' и' action_bar_title' без везения, хотя в обоих случаях 'actionViewResId' возвращает значение. Не могли бы вы предложить мне, как мне это получить. * EDIT * Извините, я не использовал 'ToolBar' – IronBlossom

7

Я думаю, что это решение является более полным, обрабатывать как обычную активность и ActionBarActivity.

Он также обрабатывает случай, когда ActionBar был установлен с помощью панели инструментов, но вы должны реализовать его в своей деятельности, которую вы создали:

public static View getActionBarView(final Activity activity) { 
    if (activity instanceof IToolbarHolder) 
     return ((IToolbarHolder) activity).getToolbar(); 
    final String packageName = activity instanceof ActionBarActivity ? activity.getPackageName() : "android"; 
    final int resId = activity.getResources().getIdentifier("action_bar_container", "id", packageName); 
    final View view = activity.findViewById(resId); 
    return view; 
} 

public interface IToolbarHolder { 
    public android.support.v7.widget.Toolbar getToolbar(); 
} 
+0

нет необходимости использовать 'final View v = window.getDecorView();', вы можете использовать 'activity.findViewById' вместо этого. –

+0

@MoshErsan Кажется правильным. может быть, у меня это откуда-то еще. –

3

Это получить Toolbar/ActionBar при использовании родной ActionBar, собственный Toolbar из AppCompat, или родной Toolbar на леденец:

public static ViewGroup findActionBar(Activity activity) { 
    int id = activity.getResources().getIdentifier("action_bar", "id", "android"); 
    ViewGroup actionBar = null; 
    if (id != 0) { 
     actionBar = (ViewGroup) activity.findViewById(id); 
    } 
    if (actionBar == null) { 
     actionBar = findToolbar((ViewGroup) activity.findViewById(android.R.id.content) 
       .getRootView()); 
    } 
    return actionBar; 
} 

private static ViewGroup findToolbar(ViewGroup viewGroup) { 
    ViewGroup toolbar = null; 
    for (int i = 0, len = viewGroup.getChildCount(); i < len; i++) { 
     View view = viewGroup.getChildAt(i); 
     if (view.getClass().getName().equals("android.support.v7.widget.Toolbar") 
       || view.getClass().getName().equals("android.widget.Toolbar")) { 
      toolbar = (ViewGroup) view; 
     } else if (view instanceof ViewGroup) { 
      toolbar = findToolbar((ViewGroup) view); 
     } 
     if (toolbar != null) { 
      break; 
     } 
    } 
    return toolbar; 
} 
5

для support.v7 getActionBarView (ById) не работает.

это возвращает ActionBar Панель инструментов:

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

    ViewGroup actionBar = getActionBar(getWindow().getDecorView()); 
    TextView actionBarTitle = (TextView) actionBar.getChildAt(0); 
} 

public ViewGroup getActionBar(View view) { 
    try { 
     if (view instanceof ViewGroup) { 
      ViewGroup viewGroup = (ViewGroup) view; 

      if (viewGroup instanceof android.support.v7.widget.Toolbar) { 
       return viewGroup; 
      } 

      for (int i = 0; i < viewGroup.getChildCount(); i++) { 
       ViewGroup actionBar = getActionBar(viewGroup.getChildAt(i)); 

       if (actionBar != null) { 
        return actionBar; 
       } 
      } 
     } 
    } catch (Exception e) { 
    } 

    return null; 
} 
+0

Добро пожаловать в переполнение стека! Хотя этот код может ответить на вопрос, было бы лучше включить некоторый _context_, объясняя _how_ он работает и _when_ использовать его. Ответы только на код не полезны в долгосрочной перспективе. –

+0

Хорошее решение для получения экземпляра панели инструментов. – Khan

Смежные вопросы