Android Tablayout, почему вкладки не двигаются?

Я следил за этим руководством https://thewikihow.com/video_zcnT-3F-9JA Я использовал его код из github, но вывод неверный. Я поместил 3 вкладки вверху, и когда я нажимаю на вкладку, активность должна измениться, но на самом деле ничего не происходит, у меня на экране остается только main_activity. Надеюсь, кому-то поможет. Вот мои коды

PS - Да, у меня также есть 3 xml файла для каждого фрагмента (даже у меня также есть main_activity, но я должен выяснить, что не так, а затем назначить 1 вкладку с основным действием). У меня также есть 3 java файла для этих 3 вкладок.

XML

<?xml version = "1.0" encoding = "utf-8"?>
<android.support.v4.widget.NestedScrollView xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:background = "#FFFFFF"
    android:orientation = "vertical"
    tools:context = ".MainActivity">

    <RelativeLayout
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content">

        <android.support.design.widget.TabLayout
            android:id = "@+id/tabs"
            android:layout_width = "match_parent"
            android:layout_height = "wrap_content" />

        <android.support.v4.view.ViewPager
            android:id = "@+id/container"
            android:layout_width = "match_parent"
            android:layout_height = "match_parent"
            app:layout_behavior = "@string/appbar_scrolling_view_behavior" />


        <TextView
            android:id = "@+id/lvltext"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:layout_below = "@id/expa"
            android:layout_centerInParent = "true"
            android:fontFamily = "@font/futuracondensed"
            android:text = "@string/leveltext"
            android:textColor = "@color/black"
            android:textSize = "30sp" />

        <TextView

            android:id = "@+id/lvlnum"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:layout_below = "@id/lvltext"
            android:layout_centerInParent = "true"
            android:fontFamily = "@font/futuracondensed"
            android:text = "@string/levelnum"
            android:textColor = "@color/black"
            android:textSize = "30sp" />

        <ImageView
            android:id = "@+id/girl"
            android:layout_width = "wrap_content"
            android:layout_height = "262dp"
            android:layout_below = "@id/lvlnum"
            android:src = "@drawable/girl" />

        <Button
            android:id = "@+id/button"
            android:layout_width = "match_parent"
            android:layout_height = "match_parent"
            android:layout_below = "@id/girl"
            android:fontFamily = "@font/futuracondensed"
            android:text = "@string/button"
            android:textColor = "@color/black" />

        <ImageView
            android:id = "@+id/girl2"
            android:layout_width = "match_parent"
            android:layout_height = "258dp"
            android:layout_below = "@id/button"
            android:src = "@drawable/fitnessmodel" />

        <Button
            android:id = "@+id/button2"
            android:layout_width = "match_parent"
            android:layout_height = "match_parent"
            android:layout_below = "@id/girl2"
            android:fontFamily = "@font/futuracondensed"
            android:text = "@string/button2"
            android:textColor = "@color/black" />

        <LinearLayout
            android:layout_below = "@id/tabs"
            android:id = "@+id/expa"
            android:layout_width = "match_parent"
            android:layout_height = "wrap_content"
            android:orientation = "horizontal">

            <LinearLayout
                android:layout_width = "0dp"
                android:layout_height = "wrap_content"
                android:layout_weight = "1"
                android:orientation = "vertical">

                <TextView
                    android:id = "@+id/team_a_score"
                    android:layout_width = "match_parent"
                    android:layout_height = "match_parent"
                    android:fontFamily = "@font/futuracondensed"
                    android:gravity = "center"
                    android:paddingBottom = "5dp"
                    android:text = "0"
                    android:textColor = "@color/black"
                    android:textSize = "60sp" />
            </LinearLayout>

            <View
                android:layout_width = "1dp"
                android:layout_height = "match_parent"
                android:layout_marginTop = "0dp"
                android:background = "@color/black" />

            <LinearLayout
                android:layout_width = "0dp"
                android:layout_height = "match_parent"
                android:layout_weight = "1"
                android:orientation = "vertical">

                <TextView
                    android:id = "@+id/team_b_score"
                    android:layout_width = "match_parent"
                    android:layout_height = "wrap_content"
                    android:fontFamily = "@font/futuracondensed"
                    android:gravity = "center"
                    android:paddingBottom = "5dp"
                    android:text = "100"
                    android:textColor = "@color/black"
                    android:textSize = "60sp" />
            </LinearLayout>
        </LinearLayout>
    </RelativeLayout>

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

Ява

public class MainActivity extends AppCompatActivity {
    private SectionsPageAdapter mSectionsPageAdapter;

    private ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = findViewById(R.id.container);
        setupViewPager(mViewPager);

        TabLayout tabLayout = findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);
    }

    private void setupViewPager(ViewPager viewPager) {
        SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
        adapter.addFragment(new Tab1Fragment(), "TAB1");
        adapter.addFragment(new Tab2Fragment(), "TAB2");
        adapter.addFragment(new Tab3Fragment(), "TAB3");
        viewPager.setAdapter(adapter);
    }


    @Override
    public void onResume() {
        super.onResume();
    }
}



public class SectionsPageAdapter extends FragmentPagerAdapter {

        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        public SectionsPageAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }
    }

Вы добавляли какой-либо контент в Tab1Fragment, Tab2Fragment и Tab3Fragment? При нажатии на Tab он заменит Fragment в ViewPager, не изменит активность

Chintak Patel 29.03.2018 08:13

Да, я сделал все, как в учебнике (на каждой вкладке есть кнопка с всплывающим сообщением, за исключением того, что у меня есть собственное основное действие). Я хочу, чтобы это было так, когда я запускаю приложение, я нахожусь на первой вкладке (основное действие), а затем, когда я нажимаю на другую вкладку (tab2), я перехожу на другой экран.

Redas Shuliakas 29.03.2018 08:22

Проблема в вашем макете, а не в вашем коде. U использовал вложенную прокрутку внутри, вы использовали вкладки и viepager. Вот почему вещи не работают.

androholic 29.03.2018 08:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
932
3

Ответы 3

попробуйте этот код:

OneFragment.java

OneFragment.java
package info.androidhive.materialtabs.fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import info.androidhive.materialtabs.R;


public class OneFragment extends Fragment{

public OneFragment() {
    // Required empty public constructor
}

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_one, container, false);
}

 }

fragment_one.xml

 fragment_one.xml
<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 = "info.androidhive.materialtabs.fragments.OneFragment">

 <TextView
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:text = "@string/one"
    android:textSize = "40dp"
    android:textStyle = "bold"
    android:layout_centerInParent = "true"/>

</RelativeLayout>

activity_main.xml

<android.support.design.widget.CoordinatorLayout 
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.support.design.widget.AppBarLayout
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
    android:theme = "@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <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" />

    <android.support.design.widget.TabLayout
        android:id = "@+id/tabs"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        app:tabMode = "fixed"
        app:tabGravity = "fill"/>
    </android.support.design.widget.AppBarLayout>

   <android.support.v4.view.ViewPager
    android:id = "@+id/viewpager"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    app:layout_behavior = "@string/appbar_scrolling_view_behavior"  />
</android.support.design.widget.CoordinatorLayout>

MainActivity.java

  package info.androidhive.materialtabs.activity;

import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

import java.util.ArrayList;
import java.util.List;

import info.androidhive.materialtabs.R;
import info.androidhive.materialtabs.fragments.OneFragment;
import info.androidhive.materialtabs.fragments.ThreeFragment;
import info.androidhive.materialtabs.fragments.TwoFragment;

[![][1]][1]public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

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

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new 
ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new OneFragment(), "ONE");
    adapter.addFragment(new TwoFragment(), "TWO");
    adapter.addFragment(new ThreeFragment(), "THREE");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
  }
 }

и добавляем основное действие, вызывающее 3 вкладки

     private class MyPagerAdapter extends FragmentPagerAdapter {

     public MyPagerAdapter(FragmentManager fm) {
        super(fm);
     }

    @Override
    public Fragment getItem(int pos) {
        switch(pos) {
            case 0: return SimpleFragment.newInstance("FirstFragment, Instance 1");
            case 1: return PieView.newInstance("SecondFragment, Instance 1");
            case 2: return PieView1.newInstance("ThirdFragment, Instance 1");
             case 3: return DataSaveDetails.newInstance("ThirdFragment, Instance 1");
              default:
        }
        return null;
    }

это работает, попробуйте это

Я реорганизовал все с помощью вашего кода ... Ну, во-первых, «стрелка назад» никогда не исчезает и ничего не делает, и, самое главное, я все еще выполняю основное действие, и это не меняется, когда я нажимаю на вкладку.

Redas Shuliakas 29.03.2018 08:44

Вы предоставили код из другой программы ... У меня нет "SimpleFragment" и т. д., Я пытался поместить туда "OneFragment", не работающий ...

Redas Shuliakas 29.03.2018 08:50

Использовал этот общедоступный фрагмент getItem (int position) {switch (position) {case 0: return new OneFragment (); случай 1: вернуть новый TwoFragment (); случай 2: вернуть новый ThreeFragment (); по умолчанию:} return null; }

Redas Shuliakas 29.03.2018 08:53

В вашем методе getItem (). Используйте Switch и возвращайте их фрагменты вместо добавления всех фрагментов в метод addFragment.

    public Fragment getItem(int position){
     switch(position){
       case 0 : return new Tab1Fragment();
       case 1 : return new Tab2Fragment();
       case 2 : return new Tab3Fragment();
     }

    }

Спасибо, я знаю, о чем вы говорите, но, как видите, у меня проблемы другого типа.

Redas Shuliakas 29.03.2018 08:28

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

<?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"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "vertical"
    tools:context = "com.example.chirag.slidingtabsusingviewpager.MainActivity">

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

        <TextView
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:text = "SlidingTabsUsingViewPager"
            android:textSize = "20dp"/>


    </android.support.v7.widget.Toolbar>

    <android.support.design.widget.TabLayout
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:id = "@+id/tablayout"
        android:background = "@color/colorPrimary"
        android:minHeight = "?attr/actionBarSize"
        android:theme = "@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    </android.support.design.widget.TabLayout>

    <android.support.v4.view.ViewPager
        android:layout_width = "match_parent"
        android:layout_height = "fill_parent"
        android:id = "@+id/pager">

    </android.support.v4.view.ViewPager>

</LinearLayout>

Честно говоря, ты мой герой и гений! Но единственное, что нужно отполировать. Теперь наверху у меня есть «Панель инструментов», которую я хочу удалить (если это возможно), потому что теперь у меня есть «дополнительная» панель со «стрелкой назад» и строкой на панели инструментов «Имя моего приложения + SlidingTabsUsingViewPager», можете вы угадай, что я могу сделать?

Redas Shuliakas 29.03.2018 10:10

Ну, может быть, я привел сбивающее с толку объяснение, как это выглядит (не могу найти снимок экрана на моем телефоне), так что это похоже на комментарий Android Geek ниже.

Redas Shuliakas 29.03.2018 10:12

(удалить строку заголовка и т. д.) stackoverflow.com/questions/2591036/…

androholic 29.03.2018 11:13

(или вы можете использовать это) stackoverflow.com/questions/36236181/…

androholic 29.03.2018 11:14

Ссылки, которые вы предоставили, не помогают, потому что они удаляют строку состояния (сеть, Wi-Fi, время и т. д.), А не то, о чем я говорил.

Redas Shuliakas 30.03.2018 06:14

Я удалил из вас текстовое представление xml "SlidingTabsUsingViewPager", теперь у меня вверху отображается имя моего приложения, я пытался удалить его на Java (обычно работает) и пытался сделать это в xml, ничего не работает, я думаю, это потому, что у меня есть панель инструментов "в xml ... Я сейчас очень запутался ....

Redas Shuliakas 30.03.2018 06:27

Я сделал это полностью! Сам я удалил Toolbar из XML и добавил эти строки Java // toolbar = (Toolbar) findViewById (R.id.toolbar); // setSupportActionBar (панель инструментов); //getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Redas Shuliakas 30.03.2018 06:29

Другие вопросы по теме