Как отключить переход фрагментов? - PullRequest
0 голосов
/ 19 сентября 2019

Я создаю приложение для викторины с тремя вопросами, и поэтому у меня есть 6 фрагментов, но я хотел бы отключить переход по умолчанию из одного фрагмента в другой, как я могу этого добиться?Я уже отключил, что вы можете проводить пальцем между фрагментами, вы должны нажать кнопку, чтобы перейти к следующему фрагменту, но после нажатия кнопки все равно есть какой-то скользящий переход.Я искал это, но не было ответа, который бы подходил моей проблеме.Вот один пример фрагмента:

public class FragmentQuestion1 extends Fragment {

private Button btnNavFrag1;
private EditText editText;
private ProgressBar m_bar;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable       ViewGroup container, @Nullable Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_question_1, container, false);

btnNavFrag1 = view.findViewById(R.id.btn_question1);

editText = view.findViewById(R.id.edit_text_question_1);
editText.addTextChangedListener(new NumberTextWatcher(editText));

m_bar = view.findViewById(R.id.progress_bar_question_1);





btnNavFrag1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        ((GameActivity)getActivity()).setViewPager(2);

    }
});

return view;
 }

 // Method that is used so the countdown starts when the user gets to               this fragment
 @Override
 public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
if (visible) {
    startCountdownTimer();
}
 }

  // Countdown 17 seconds

int i = 0;


private void startCountdownTimer() {

m_bar.setProgress(i);

final int totalMsecs = 17 * 1000; // 17 seconds in milli seconds
int callInterval = 100;

/** CountDownTimer */
new CountDownTimer(totalMsecs, callInterval) {

    public void onTick(long millisUntilFinished) {

        int secondsRemaining = (int) millisUntilFinished / 1000;

        float fraction = millisUntilFinished / (float) totalMsecs;

        // progress bar is based on scale of 1 to 100;
        m_bar.setProgress((int) (fraction * 100));
    }

    public void onFinish() {
    }
}.start();

}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

В вашем макете XML определите tablayout и FrameLayout следующим образом:

        ..................your xml code...............

 .............................................................   

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/simpleTabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabBackground="@color/colorPrimary"
            app:tabIndicatorColor="#0080FF"
            app:tabSelectedTextColor="#050505"
            app:tabTextColor="@color/colorAccent">

            <com.google.android.material.tabs.TabItem
                android:id="@+id/abcd"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Item 1" />

            <com.google.android.material.tabs.TabItem
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="item 2" />

            <com.google.android.material.tabs.TabItem
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="item 3" />
        </com.google.android.material.tabs.TabLayout>



        <FrameLayout
            android:id="@+id/simpleFrameLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

Этот макет определен для трех вкладок.Вы можете сделать это для большего количества вкладок, добавив больше вкладок, если хотите.

Затем определите фрагменты для каждой вкладки.В этом случае: item_one_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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="your.activity.context">

    ......................................
............................................
fragments xml 
.............................
,.....................................

</RelativeLayout>

Аналогично макетам фрагментов элемента 2 и элемента 3.

Затем определите фрагменты в java:

public class FirstItemFragment extends Fragment {

    public ListView CallListView;

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

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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        final View view = inflater.inflate(R.layout.item_one_fragment, container, false);


// Inflate the layout for this fragment
        return view;

    }




}

По аналогии второй и третийфрагмент.

Затем в своей основной деятельности:

FrameLayout simpleFrameLayout = (FrameLayout) findViewById(R.id.simpleFrameLayout);
       TabLayout tabLayout = (TabLayout) findViewById(R.id.simpleTabLayout);


        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.simpleFrameLayout, new FirstItemFragment());
        ft.commit();


        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                // get the current selected tab's position and replace the fragment accordingly
                Fragment fragment = null;
                switch (tab.getPosition()) {
                    case 0:
                        fragment = new FirstItemFragment();
                        break;
                    case 1:
                        fragment = new SecondItemFragment();
                        break;
                    case 2:
                        fragment = new ThirdItemFragment();
                        break;
                }

                getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.simpleFrameLayout, fragment)
                .addToBackStack(null)
                //Commit the transaction.
                .commit();

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        }); 

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

0 голосов
/ 19 сентября 2019

Поскольку вы используете viewPager, вы можете использовать библиотеку, подобную this , которая позволяет добавлять преобразователь (какой-то эффект) к viewPager при переходе к следующему фрагменту.Я бы порекомендовал ZoomOutTranformer для вашего случая использования.Если переход не соответствует ожидаемому, вы всегда можете расширить этот класс и переопределить переход, чтобы он вам больше понравился.

ViewPagerTransformers являются родными, поэтому вам не нужно использовать библиотеку.Просто создайте класс, реализуйте интерфейс PageTransformer и переопределите метод transformPage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...