2015-09-03 4 views
4

Мое приложение имеет панель инструментов, которая должна присутствовать на каждом представлении. В настоящее время, я следующий в моем onCreate() метода для каждого вида деятельности у меня есть:Панель инструментов вызова по каждому виду деятельности

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

ли это нужно сделать в каждом onCreate() метода в каждой деятельности или есть более простой способ? Кроме того, в качестве побочного вопроса, как я могу реализовать функцию «назад» на панели инструментов, которая возвращает пользователю одно действие, если оно нажмет на него?

+0

Да, это требуется .. Если вы используете фрагменты & сочетание активности означает, что один инструмент бар будет выполнять работу, которая присутствует в базовой деятельности –

ответ

15

Создать базовый класс для Activity

public abstract class BaseActivity extends AppCompatActivity { 

    Toolbar toolbar; 

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

    protected abstract int getLayoutResource(); 

    private void configureToolbar() { 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    if (toolbar != null) { 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
     FragmentManager fm = getSupportFragmentManager(); 
     if (fm != null && fm.getBackStackEntryCount() > 0) { 
      fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     } else { 
      finish(); 
     } 
     return true; 
     default: 
     return super.onOptionsItemSelected(item); 
    } 
    } 
} 

И в каждом Activity расширяет это BaseActivity получить ToolBar и реализации заднюю функцию.

Наконец, не забудьте указать ToolBar в каждом виде деятельности layout.

Edit:

Override этот метод getLayoutResource() в каждом Activity и передать макет идентификатор.

public class MainActivity extends BaseActivity { 

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

    @Override 
    public int getLayoutResource() { 
    return R.layout.activity_main; 
    } 
+0

'Не удается разрешить метод getLayoutResource()' error. – user5294977

+0

@ user5294977 см. Мое редактирование .. Вам необходимо переопределить getLayoutResource() в каждом методе и вернуть в нем идентификатор макета. –

+0

Могу ли я добавить 'getLayoutResource()' в BaseActivity, поэтому мне не нужно помещать метод в каждую активность? – user5294977

0

Если вы использовали Activity затем создать BaseActivity, расширяющий AppCompatActivity или ActionBarActivity (DEPRECATED) и переместить Toolbar код BaseActivity.

public class BaseActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
    } 
} 

Если вы использовали Fragment затем создать BaseFragment, расширяющий Fragment и двигаться Toolbar код BaseFragment.

public class BaseFragment extends Fragment { 

    View main; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     main = inflater.inflate(R.layout.fragment_about, container, false); 
     Toolbar toolbar = (Toolbar) main.findViewById(R.id.toolbar); 
     getActivity().setSupportActionBar(toolbar); 
     return main; 
    } 
} 

В main макета XML вы должны добавить Toolbar XML-код.

Теперь в каждом представлении (активность) расширяет BaseActivity вместо AppCompatActivity или ActionBarActivity, так что вы можете получить доступ Toolbar в каждом представлении.

public class YourActivity extends BaseActivity{ 
//your code 
} 

EDIT1:

main.xml

<RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:theme="@style/toolbarTheme" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="@color/green" 
      android:minHeight="?attr/actionBarSize" /> 

</RelativeLayout> 

EDIT2:

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
getSupportActionBar().setHomeButtonEnabled(true); 

добавить эти две строки ниже setSupportActionBar(toolbar); в BaseActivity.

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

+0

Что такое 'R.layout.main', ссылаясь на? – user5294977

+0

Странно. Панель инструментов загружается, но текст/значки на панели инструментов этого не делают. – user5294977

+0

попробуйте edit2, тогда появится значок – Rajesh

0

Это зависит от вашей реализации, но если вы хотите избежать кода шаблона, вы должны использовать хорошее программирование OO.

Пример использования фрагмента.

public abstract class FragmentBase extends Fragment { 

    protected void settingsToolbar(View rootView) { 

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

     ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); 
     final ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); 
     if (actionBar != null) { 
      // TODO add your code and your requirements 
      actionBar.setDisplayShowTitleEnabled(true); 
      actionBar.setDisplayHomeAsUpEnabled(true); 

     } 
    } 




} 

Надеюсь, это может дать вам идею.

0

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

FirtActivity extends BaseActivity 

SecondActivity extends BaseActivity 

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

if(this instance of FirstActivity){ 
    //do stuff here 
}else if(this instance of SecondActivity){ 
//do stuff here 
} 
2

Это моя реализация. Это устраняет необходимость в getLayoutResources() из принятого ответа и возвращает «setContentView()» во всех видах деятельности, как нормальный

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> 
Смежные вопросы