Как программно переключиться на другой фрагмент?

У меня есть два фрагмента (layout_first.xml и layout_second.XML.)
Я хочу сделать это: Нажмите кнопку (Показать второй) в первом фрагменте, чтобы показать второй фрагмент и получить значение EditText в первом фрагменте, чтобы установить значение EditText во втором фрагменте programmaticaly.

Вот мой код:

activity_main.XML

<android.support.design.widget.CoordinatorLayout
    
    
    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="@dimen/custom_tab_layout_height"
            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>

layout_first.XML

<LinearLayout 
    
    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_orientation="horizontal"
    android_focusable="true"
    android_background="#bc8383">

    <Button
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_text="Show Second"
        android_id="@+id/btnShowSecond"
        android_layout_weight="0.18" />

    <EditText
        android_id="@+id/et1"
        android_text="et1"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_background="#000000"
        android_elegantTextHeight="false"
        android_maxLength="20"
        android_singleLine="true"
        android_textAlignment="center"
        android_textColor="#85b27e"
        android_textSize="40dp"
        android_paddingLeft="3dp"
        android_paddingRight="3dp"
        android_layout_marginTop="10dp"
        android_layout_weight="1" />
</LinearLayout>

layout_second.XML

<LinearLayout 
    
    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_orientation="vertical"
    android_focusable="true"
    android_background="#bc8383">

    <EditText
        android_id="@+id/et2"
        android_text="et2"
        android_layout_width="match_parent"
        android_layout_height="wrap_content"
        android_background="#000000"
        android_elegantTextHeight="false"
        android_maxLength="20"
        android_singleLine="true"
        android_textAlignment="center"
        android_textColor="#85b27e"
        android_textSize="40dp"
        android_paddingLeft="3dp"
        android_paddingRight="3dp"
        android_layout_marginTop="10dp"
        android_layout_gravity="center_horizontal" />

    <Button
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_text="btn2"
        android_id="@+id/btn2"
        android_layout_gravity="center_horizontal" />
</LinearLayout>

пользовательская вкладка.XML

<?xml version="1.0" encoding="utf-8"?>
<TextView 
    android_layout_width="match_parent"
    android_layout_height="wrap_content"
    android_id="@+id/tab"
    android_textColor="@color/colorAccent"
    android_textSize="14dp"
    android_gravity="center"
    android_fontFamily="@string/font_fontFamily_medium"/>

MainActivity.Ява

package xmaxsoft.delfragment;

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 android.view.LayoutInflater;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;

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);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        setupTabIcons();
    }

    private void setupTabIcons() {
        TextView tabOne = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
        tabOne.setText("One");
        tabLayout.getTabAt(0).setCustomView(tabOne);

        TextView tabTwo = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
        tabTwo.setText("Two");
        tabLayout.getTabAt(1).setCustomView(tabTwo);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new First(), "One");
        adapter.addFrag(new Second(), "Two");
        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 addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

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

Первый.Ява

package xmaxsoft.delfragment;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

public class First extends Fragment {
    public First() {
    }

    Button btnShowSecond;
    EditText et1;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.layout_first, container, false);
        btnShowSecond = (Button) view.findViewById(R.id.btnShowSecond);
        et1 = (EditText) view.findViewById(R.id.et1);
        btnShowSecond.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
            //what kind of code must be here ???
            //what kind of code must be here ???
            //what kind of code must be here ???
            }
        });
        return view;
    }
}

Второй.Ява

package xmaxsoft.delfragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

public class Second extends Fragment {
    public Second() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.layout_second, container, false);
        //
        return view;
    }
}

4 ответа

  1. Использовать коды:-

     Fragment fragment = new XXXFragment();
           if (fragment != null) {
    
     FragmentManager fragmentManager   =getActivity().getSupportFragmentManager();
                                    fragmentManager.beginTransaction().replace(R.id.frame_container, fragment, "TAG").commit();
    

    }

  2. Поскольку эти два фрагмента используют одно и то же действие,

    установить значение из первого фрагмента :

                public void onClick(View v) {
                //what kind of code must be here ???
                //what kind of code must be here ???
                //what kind of code must be here ???
       getActivity().getIntent().putExtra("key", "value");
                }
    

    Чтобы получить значение из второго фрагмента :

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            final View view = inflater.inflate(R.layout.activity_second, container, false);
            //
     EditText et2 = (EditText) view.findViewById(R.id.et2);
    String valueofet1 = getActivity().getIntent().getExtras().getString("key");
    et2.setText(valueofet1 );
            return view;
        }
    
  3. Лучше заменить фрагмент из действия.

    В вашем первом фрагменте на btnShowSecond нажмите listener внутри onClick проверьте, если activity не null, и если это экземпляр main activity и вызовите метод внутри mainActivity, который переключит фрагменты как таковые.

    if(getActivity()!=null && getActivity instanceof MainActivity){
           ((MainActivity)getActivity()).showSecondFragment();
     }
    

    А метод showSecondFragment () внутри MainActivity выглядит следующим образом.

    public void showSecondFragment(){
         getSupportFragmentManager().beginTransaction().replace(R.id.<the layout where you want to show second fragment>,new Second()).commit();
    

    Пожалуйста дайте мне знать если вы имеете любые сомнения. Надеюсь, это поможет.

    Лучший способ сделать это-использовать интерфейс для вызова методов в действии из вашего фрагмента.

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

    https://laaptu.wordpress.com/tag/android-communication-between-fragment-and-activity/

  4. Попробовать это:

    FragmentManager mFragmentManager;
    FragmentTransaction mFragmentTransaction;
    btnShowSecond.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    mFragmentManager = getFragmentManager();
                    mFragmentTransaction = mFragmentManager.beginTransaction();
                    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                    fragmentTransaction.replace(R.id.containerView, new second()).addToBackStack("second").commit();
                }
            });
    

    на XML Add FrameLayout& I упомянутый id-containerView надеюсь, что это может помочь