2

Мои действия распространяются на общий базовый актив, где я объявляю и инициализирую общедоступные переменные, такие как context типа Context, activity типа Activity и mActionBar типа ActionBar.Панель действий, панель инструментов, наследование активности

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

Но с появлением Toolbar, я немного смущен о том, как это сделать. Панель инструментов не похожа на ActionBar и заменяет ее, но также расширяет ее.

ActionBar - это объект вида, который всегда доступен для извлечения, действием ActionBar, и он находится над создаваемыми представлениями. Это нигде не объявляется в XML-формате.

Но панель инструментов объявлена ​​только в макете XML, поэтому я должен включать ее во все создаваемые макеты, иначе я не смогу получить доступ к объекту панели инструментов.

Обычно я использую setContentView(R.layout.mylayout) в методе onCreate каждого отдельного вида деятельности. И затем я должен инициализировать объект панели инструментов после этого, используя findViewById. Поэтому я не могу поместить этот код в свою функцию onCreate BaseActivity, потому что setContentView еще не был бы инициализирован.

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

Причина, по которой мне любопытно, что мои действия наследуют панель инструментов, заключается в том, что для полного кошмара для Google внезапно требуется, чтобы устройства Android 4.0-4.4 использовали пакет совместимости v7, полностью заменили панель действий на Объект панели инструментов используйте фрагменты пакета совместимости v4 вместо собственных, все используют новейшие парадигмы дизайна.

+0

«эй проверить V21! Но ваше v17 устройство должно использовать объекты v4 для проверки it out " – CQM

+0

Вы можете установить представление содержимого с помощью Панели инструментов в базовом классе Activity и раздуть подклассы« Представления »в контейнер ViewGroup контейнера в базовом макете. –

+0

@MikeM. Я чувствую, что это будет проблемой. Я также использую DrawerLayout NavigationDrawer, который появляется перед ToolBar и должен быть корневым элементом. В других случаях я также использую другие библиотеки, которые полагаются на корневой элемент. – CQM

ответ

4

Это моя реализация. Надеюсь, это поможет кому-то.

public abstract class BaseActivity extends AppCompatActivity { 

    Toolbar toolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    protected boolean useToolbar() { 
     return true; 
    } 

    @Override 
    public void setContentView(int layoutResID) { 
     View view = getLayoutInflater().inflate(layoutResID, null); 
     configureToolbar(view); 
     super.setContentView(view); 
    } 

    private void configureToolbar(View view) { 
     toolbar = (Toolbar) view.findViewById(R.id.toolbar); 
     if (toolbar != null) { 
      if (useToolbar()) { 
       setSupportActionBar(toolbar); 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      } else { 
       toolbar.setVisibility(View.GONE); 
      } 
     } 
    } 
} 

Отныне вы просто расширяете BaseActivity. Если вам не нужна панель инструментов, вам придется переопределить useToolbar().

Не забудьте добавить в activity.xml в верхней

<include layout="@layout/toolbar" /> 

toolbar.xml

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 
</merge> 
Смежные вопросы