-2

I am new to Android. Please excuse me if it's a silly question:

If i click on button of a Fragment - it has to trigger a test and show the result in other Fragment. So to make things simple, have written a code on button click as follows. It's not working. Please suggest.

My actual intent is to register a log.add BroadcastReceiver, so that anywhere any log error or debug is called, that message has to appear in the TestStatusFragment.

public class TriggerTestFragment extends Fragment {

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

        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_trigger, container, false);

        Button stopScheduler = (Button) view.findViewById(R.id.testButton);

        stopScheduler.setOnClickListener((View sview) -> {

            View teststatusView = inflater.inflate(R.layout.fragment_teststatus, container, false);

            TextView textView = (TextView) teststatusView.findViewById(R.id.text_view);

            textView.setText("test result....");

        });

        return view;
    }
}

MainActivity.java

private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new TriggerTestFragment(), "TRIGGERTEST");
        adapter.addFragment(new TestStatusFragment(), "TEST STATUS");
        viewPager.setAdapter(adapter);
    }

Second Fragment:

public class TestStatusFragment extends Fragment {

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

        Context context = getContext();

        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_teststatus, container, false);


        return view;
    }
}
Molay
  • 1,154
  • 2
  • 19
  • 42

1 Answers1

0

Use interface to communicate between them.

Fragment One

public class FragOne extends Fragment {

    EditText etxtName, etxtDesc;
    Button btnSubmit;
    String name, desc;

    private OnFragmentInteractionListener mListener;

    public FragOne() {
        // 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_frag_one, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        etxtName = (EditText) view.findViewById(R.id.etxtName);
        etxtDesc = (EditText) view.findViewById(R.id.etxtDesc);
        btnSubmit = (Button) view.findViewById(R.id.btnSubmit);

        btnSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                name = etxtName.getText().toString().trim();
                desc = etxtDesc.getText().toString().trim();

                if(name == null || desc == null) {
                    Toast.makeText(getActivity(), "Both fields required", Toast.LENGTH_SHORT).show();
                } else {
                    mListener.onFragmentInteraction(name, desc);
                    etxtName.setText("");
                    etxtDesc.setText("");
                }
            }
        });
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        void onFragmentInteraction(String name, String desc);
    }
}

Fragment Two

public class FragTwo extends Fragment implements FragOne.OnFragmentInteractionListener{

    TextView textView, textDesc;

    public FragTwo() {
        // 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_frag_two, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        textView = (TextView) view.findViewById(R.id.txtName);
        textDesc = (TextView) view.findViewById(R.id.txtDesc);
    }

    @Override
    public void onFragmentInteraction(String name, String desc) {
        textView.setText(name);
        textDesc.setText(desc);
    }

}

Init fragments

fragOne = new FragOne();
fragTwo = new FragTwo();

PagerAdapter

public static class MyPagerAdapter extends FragmentPagerAdapter implements FragOne.OnFragmentInteractionListener{

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

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return fragOne;
            case 1:
                return fragTwo;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "Page " + position;
    }

    @Override
    public void onFragmentInteraction(String name, String desc) {
        fragTwo.onFragmentInteraction(name, desc);
    }
}

MainActivity need implement onFragmentInteraction interface

public class MainActivity extends AppCompatActivity implements FragOne.OnFragmentInteractionListener{

    static FragOne fragOne;
    static FragTwo fragTwo;
    MyPagerAdapter myPagerAdapter;
    ViewPager viewPager;


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

        fragOne = new FragOne();
        fragTwo = new FragTwo();
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        myPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(myPagerAdapter);
    }

    @Override
    public void onFragmentInteraction(String name, String desc) {
        myPagerAdapter.onFragmentInteraction(name, desc );
    }

    public static class MyPagerAdapter extends FragmentPagerAdapter implements FragOne.OnFragmentInteractionListener{

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

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return fragOne;
                case 1:
                    return fragTwo;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return "Page " + position;
        }

        @Override
        public void onFragmentInteraction(String name, String desc) {
            fragTwo.onFragmentInteraction(name, desc);
        }
    }
}

You can read full article here https://www.mytrendin.com/passing-data-between-fragments/

Tung Duong
  • 1,156
  • 7
  • 19