Я пытаюсь создать приложение с вкладками внизу, которое при нажатии пользователь может перейти к различным представлениям. И когда кнопка нажата на эти виды, запускается новое действие, но нижнее меню вкладок остается там (и пользователь может продолжить навигацию к другим представлениям, если они захотят). Как я могу сделать это без устаревших способов?Вкладки Android с действиями
ответ
Вы можете использовать фрагменты и только один вид деятельности,
Активность будет иметь фиксированные вкладки в нижней и контейнер для сменных фрагментов.
Всякий раз, когда вы хотите перейти к другому виду, просто замените фрагмент в контейнере активности, а нижние вкладки останутся такими, какие есть.
Но когда я нажимаю кнопку в фрагменте, я хочу запустить на его место действие. Должен ли я запускать новый фрагмент? –
@CapBaracudas: «Должен ли я запускать новый фрагмент?» -- да. Если вам нужен постоянный бит пользовательского интерфейса (например, панель вкладок), переход на новые действия - это не правильное решение. – CommonsWare
Вот простой демо, показывающий использование вкладок:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
ViewPager viewPager = (ViewPager) findViewById(R.id.content_pager);
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
FragmentPager fragmentPager = new FragmentPager(getSupportFragmentManager());
for(int i = 0; i < 3; i++){
Bundle args = new Bundle();
args.putString(SimpleFragment.FRAG_KEY, "Fragment "+ i);
fragmentPager.addFragment(SimpleFragment.newInstance(args));
}
viewPager.setAdapter(fragmentPager);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
}
public class FragmentPager extends FragmentPagerAdapter{
List<Fragment> mFragments;
public FragmentPager(FragmentManager fm) {
super(fm);
mFragments = new ArrayList<>();
}
@Override
public CharSequence getPageTitle(int position) {
return "Fragment "+ position;
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
public void addFragment(Fragment fragment){
mFragments.add(fragment);
}
}
}
с помощью этого макета:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.divshark.bottomtabs.MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/content_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="?actionBarSize">
</android.support.v4.view.ViewPager>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
style="@style/MyCustomTabLayout"
android:layout_width="match_parent"
android:layout_height="?actionBarSize">
</android.support.design.widget.TabLayout>
</android.support.v7.widget.Toolbar>
</RelativeLayout>
с SimpleFragment:
public class SimpleFragment extends Fragment {
public static final String FRAG_KEY = "FragmentKey";
public static SimpleFragment newInstance(Bundle args){
SimpleFragment fragment = new SimpleFragment();
if(args != null){
fragment.setArguments(args);
}
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_simple, container, false);
AppCompatTextView mTextView = (AppCompatTextView) view.findViewById(R.id.tv_simple);
if(getArguments() != null){
String fragKey = getArguments().getString(FRAG_KEY, "No Key passed");
mTextView.setText(fragKey);
}
return view;
}
}
с планировкой:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools">
<android.support.v7.widget.AppCompatTextView
android:id="@+id/tv_simple"
tools:text="@string/app_name"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
и стиль:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
<item name="tabIndicatorColor">?attr/colorAccent</item>
<item name="tabIndicatorHeight">2dp</item>
<item name="tabPaddingStart">12dp</item>
<item name="tabPaddingEnd">12dp</item>
<item name="tabBackground">?attr/selectableItemBackground</item>
<item name="tabTextAppearance">@style/MyCustomTabTextAppearance</item>
<item name="tabSelectedTextColor">?android:textColorPrimary</item>
</style>
<style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab">
<item name="android:textSize">14sp</item>
<item name="android:textColor">?android:textColorSecondary</item>
<item name="textAllCaps">true</item>
</style>
</resources>
и build.gradle зависимостей:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:design:23.2.0'
}
Если я использую ViewPager, как я могу отслеживать мой фрагмент позже и обновлять его? Я нашел решение здесь (1), но кажется, что это должно быть более простым или более формальным способом? 1.http: //tamsler.blogspot.co.uk/2011/11/android-viewpager-and-fragments-part-ii.html –
@CapBaracudas Вы можете использовать адаптер для получения ссылки на текущий элемент в поле зрения : 'SimpleFragment fragment = (SimpleFragment) fragmentPager.getItem (viewPager.getCurrentItem());' –
- 1. Android tabhost с различными действиями
- 2. Вкладки с несколькими действиями на вкладку
- 3. Android - listview с действиями
- 4. Android с действиями
- 5. Как переключаться между различными действиями, такими как вкладки в android?
- 6. Android, отправляющий данные между действиями
- 7. Как управлять действиями в Android?
- 8. Android-приложение с несколькими действиями
- 9. Android, EspressoTesting с несколькими действиями
- 10. Используйте Android Android SDK с несколькими действиями
- 11. Android-обход между действиями
- 12. Android PagerView между действиями
- 13. Android sharedpreferences между действиями
- 14. Android Переключение между действиями
- 15. iOS 9 выбор индекса вкладки с быстрыми действиями, performActionForShortcutItem
- 16. Android обменивается между действиями
- 17. android - swiping между действиями
- 18. Общение между действиями (Android)
- 19. Производительность Android между действиями
- 20. Переключение между действиями Android
- 21. Переключение между действиями при выборе вкладки с помощью вкладок ActionBarsherlock в android
- 22. Android-приложение оптимального дизайна с несколькими действиями
- 23. Android - GridView с двумя действиями за элемент
- 24. Android - взаимодействие с сервисами и действиями
- 25. Как справляться с действиями клавиатуры Android
- 26. Служба Android, взаимодействующая с несколькими действиями
- 27. Служба Android bluetooth с несколькими действиями
- 28. Связь с обоими действиями в Android
- 29. Android back stack с несколькими действиями
- 30. Перемещение между действиями с Intents, Android
что вы хотите сделать, это использовать 1 активность и загружать несколько фрагментов. Для бара на нижней части я бы рекомендовал использовать панель инструментов и обернуть вкладки внутри этого –
Не устаревший способ? Что не рекомендуется для этого? И я не понимаю эту проблему. Почему вы не просто включаете вкладки в каждый макет? В любом случае вы должны использовать 'Фрагменты'. Именно для этого они и есть. –
Да, я могу использовать фрагмент для представления разных представлений. Но затем, когда я нажимаю кнопку, я хочу вызвать новое действие и заменить этот фрагмент, а затем, если я вернусь, я снова хочу вернуться к этому фрагменту. Это моя реальная проблема. Также как я могу использовать панель инструментов и прикрепить ее внизу? Я не могу заставить его работать на большом экране ... –