2016-02-25 2 views
0

Я пытаюсь создать приложение с вкладками внизу, которое при нажатии пользователь может перейти к различным представлениям. И когда кнопка нажата на эти виды, запускается новое действие, но нижнее меню вкладок остается там (и пользователь может продолжить навигацию к другим представлениям, если они захотят). Как я могу сделать это без устаревших способов?Вкладки Android с действиями

+0

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

+0

Не устаревший способ? Что не рекомендуется для этого? И я не понимаю эту проблему. Почему вы не просто включаете вкладки в каждый макет? В любом случае вы должны использовать 'Фрагменты'. Именно для этого они и есть. –

+0

Да, я могу использовать фрагмент для представления разных представлений. Но затем, когда я нажимаю кнопку, я хочу вызвать новое действие и заменить этот фрагмент, а затем, если я вернусь, я снова хочу вернуться к этому фрагменту. Это моя реальная проблема. Также как я могу использовать панель инструментов и прикрепить ее внизу? Я не могу заставить его работать на большом экране ... –

ответ

2

Вы можете использовать фрагменты и только один вид деятельности,

Активность будет иметь фиксированные вкладки в нижней и контейнер для сменных фрагментов.

Всякий раз, когда вы хотите перейти к другому виду, просто замените фрагмент в контейнере активности, а нижние вкладки останутся такими, какие есть.

+0

Но когда я нажимаю кнопку в фрагменте, я хочу запустить на его место действие. Должен ли я запускать новый фрагмент? –

+0

@CapBaracudas: «Должен ли я запускать новый фрагмент?» -- да. Если вам нужен постоянный бит пользовательского интерфейса (например, панель вкладок), переход на новые действия - это не правильное решение. – CommonsWare

0

Вот простой демо, показывающий использование вкладок:

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' 
} 
+0

Если я использую ViewPager, как я могу отслеживать мой фрагмент позже и обновлять его? Я нашел решение здесь (1), но кажется, что это должно быть более простым или более формальным способом? 1.http: //tamsler.blogspot.co.uk/2011/11/android-viewpager-and-fragments-part-ii.html –

+0

@CapBaracudas Вы можете использовать адаптер для получения ссылки на текущий элемент в поле зрения : 'SimpleFragment fragment = (SimpleFragment) fragmentPager.getItem (viewPager.getCurrentItem());' –

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