0

Хочу добавить табы с тулбаром, и drawerlayout поверх тулбара.

Уже три дня мучаюсь, перепробовал разные варианты.

Main Activity

static final String LOG_TAG = "SlidingTabsBasicFragment";
private SlidingTabLayout mSlidingTabLayout;
ViewPager mViewPager;

private ActionBarDrawerToggle toggle;
ListView lv_navigation_drawer;
DrawerLayout drawerLayout;

static final String TAG = "myLogs";
static final int PAGE_COUNT = 2;

ViewPager pager;
PagerAdapter pagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_sample);
    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    toggle = new ActionBarDrawerToggle(this, drawerLayout,R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    toggle.setDrawerIndicatorEnabled(true);
    drawerLayout.setDrawerListener(toggle);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,    R.layout.rowlayout, R.id.label,  new String[] {"Screen 1", "Screen 2", "Screen 3"});
    this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    this.getSupportActionBar().setHomeButtonEnabled(true);
    lv_navigation_drawer = (ListView) findViewById(R.id.lv_navigation_drawer);
    lv_navigation_drawer.setAdapter(adapter);
    lv_navigation_drawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            Log.d("log", "itemClick: position = " + position + ", id = "+ id);

            Toast.makeText(SlidingTabsActivity.this, "itemClick: position = " + position + ", id = " + id, Toast.LENGTH_LONG).show();
            drawerLayout.closeDrawer(lv_navigation_drawer);

        }
    });

    mViewPager = (ViewPager) findViewById(R.id.viewpager);
    mViewPager.setAdapter(new SamplePagerAdapter());
    mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
    mSlidingTabLayout.setViewPager(mViewPager);

/*
 * FragmentTransaction transaction =
 * getSupportFragmentManager().beginTransaction();
 * SlidingTabsBasicFragment fragment = new SlidingTabsBasicFragment();
 * transaction.replace(R.id.sample_content_fragment, fragment);
 * transaction.commit();
 */

}
public boolean onPrepareOptionsMenu(Menu menu) {
    // If the nav drawer is open, hide action items related to the content view
    boolean drawerOpen = drawerLayout.isDrawerOpen(lv_navigation_drawer);
//        menu.findItem(R.id.shake).setVisible(!drawerOpen);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (toggle.onOptionsItemSelected(item))
        return true;
    int id = item.getItemId();
    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }
    switch (item.getItemId()) {

        case R.id.action_settings:
            Toast.makeText(this, "Вы ", Toast.LENGTH_LONG).show();

            return true;
        default:
            return true;

    }
}

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

    toggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    toggle.onConfigurationChanged(newConfig);

}

fragment_sample

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"
    android:orientation="vertical">

    <android.support.v4.widget.DrawerLayout

        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <android.support.v7.widget.Toolbar
                android:id="@+id/my_awesome_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="?attr/actionBarSize"
                android:background="?attr/colorAccent"
                app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
                </android.support.v7.widget.Toolbar>

        </FrameLayout>

        <ListView
            android:id="@+id/lv_navigation_drawer"
            android:layout_width="300dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="@android:color/white" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <com.example.eldos.callreport.SlidingTabLayout
                android:id="@+id/sliding_tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>

    </android.support.v4.widget.DrawerLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:background="@android:color/white" />

</LinearLayout>

И этот код:

https://developer.android.com/samples/SlidingTabsColors/src/com.example.android.common/view/SlidingTabLayout.html

Но максимум, что получилось, так это табы поверх тулбара, хотя боковое меню работает, но так же не работает и листание.

Что и куда мне надо поместить в fragment_sample.xml, чтобы он был ниже actionbar и листался?

Обновление

Сейчас я кое-как смог сделать, чтобы они работали, а эти вкладки создаются во фрагменте и проблема в том, что она перекрывает тулбар, хоть он и назначен как экшбар, добавляю еще тулбар пустой во фрагмент, а он перекрывает тулбар от активити, и не видно кнопок экшнбара, получается, что он создает вью без тулбара, который в активити, и перекрывает его.

Как можно сдвинуть вкладки вниз, не перекрывая тулбар?

<android.support.v7.widget.Toolbar

    android:id="@+id/my_awesome_toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorAccent"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    />

А вот если тулбар поставить выше drawer layout, все хорошо, и вкладки ниже тулбара, и боковое меню работает, и кнопки, но боковое меню выходит не поверх тулбара. Куда и что надо дописать, чтобы боковое меню было поверх тулбара тоже?

0

1 ответ 1

2

Вы, видимо, не очень верно поняли концепцию DrawerLayout. Не знаю, как на счёт табов, но ViewPager точно надо поместить внутрь FrameLayout.

Поясню: DrawerLayout предполагает, что в нём будет всего 2 дочерних элемента. Один основной (там и ViewPager должен быть и ToolBar и табы). Во втором - то, что будет в "выезжающем меню". В данном случае - список.

Как минимум у вас самый верхний элемент (LinearLayout) лишний. И вот этот кусок разметки тоже явно не на месте по тем же причинам:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <com.example.eldos.callreport.SlidingTabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

Его, думаю, нужно тоже поместить внутрь FrameLayout. Ну и FrameLayout, наверняка, в данном случае, нужно на LinearLayout поменять.

Вообще гугол мне на запрос

tabs android toolbar

первой же строчкой выдал вот это, где дают вот такие ссылки на разметку и код для построения шаблона с NavDrower, Toolbar, Tabs и ViewPager. Там же говорят, что в SDK Manager есть сэмплы в т.ч. и с нужным вам кодом и разметкой.

Итого:
Поправите разметку, посмотрите ссылки, и должно получиться.

Обновление 0:

Кажется, я понял. Вы не понимаете, как действует FrameLayout. В нём все элементы перекрывают друг друга. Им можно назначить элементы сверху и/или снизу. Тогда они не будут перекрывать друг друга.

Либо, что проще, используйте LinearLayout вместо FrameLayout. Поместите в него тулбар, табы и следом ViewPager. Они выстроятся в порядке сверху вниз.

0

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.