-2

I have an Activity with viewpager in one page should be EditText and other page be the TextView, get data from first fragment to show in second view but I'm struggling because of lack of knowledge, I have Main Activity as

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
    }

    private class MyPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int pos) {
            switch(pos) {

                case 0: return EditFragment.newInstance("FirstFragment, Instance 1");
                case 1: {
                    Log.e("TAG", " is " + new EditFragment().getTag());
                    return PreviewFragment.newInstance(new EditFragment().getTag());
                }

                default: return EditFragment.newInstance("ThirdFragment, Default");
            }
        }

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

main layout is

 <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/viewpager"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

EditFragment is

public class EditFragment extends Fragment {

    public EditFragment(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_editor, container, false);

        EditText tv = (EditText) v.findViewById(R.id.content);
        tv.setText(getArguments().getString("msg"));

        return v;
    }

    public static EditFragment newInstance(String text) {

        EditFragment f = new EditFragment();
        Bundle b = new Bundle();
        b.putString("msg", text);

        f.setArguments(b);

        return f;
    }
}

PreviewFragment

public class PreviewFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_markdown, container, false);

        TextView tvView = (TextView) v.findViewById(R.id.markdownView);
        tvView.loadMarkdown(getArguments().getString("msg"));

        return v;
    }

    public static PreviewFragment newInstance(String text) {

        PreviewFragment f = new PreviewFragment();
        Bundle b = new Bundle();
        b.putString("msg", text);

        f.setArguments(b);

        return f;
    }
}

there I do not know how to pass data from EditFragment to PreviewFragment, please help.

I'm newbie to Fragments please help me.

UPDATE

I have changed

public class PreviewFragment extends Fragment {

    private TextView textView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_markdown, container, false);
        textView = (TextView) v.findViewById(R.id.title);// initialized here
        return v;
    }


    public void b_updateText(String t){
        Log.e("LOAD TXT", t);// Here I can get data  Data is available
        textView.setText(t); // but Here I get NPE, don't know why. 
    }
}

but Here I get NPE, don't know why.

and EditFragment is

public class EditFragment extends Fragment {

    public EditFragment(){}
    private static Bundle bundle = null;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_editor, container, false);

        final EditText tv = (EditText) v.findViewById(R.id.content);

        final PsgerActivity  mainActivity = ( PsgerActivity) getActivity();
        mainActivity.message= tv.getText().toString();
        tv.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                bundle = new Bundle();
                bundle.putString("md", tv.getText().toString());
                Log.e("BUNDLE", bundle.getString("md"));// Data is available
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

        return v;
    }

    public static EditFragment newInstance() {
        EditFragment f = new EditFragment();
        f.setArguments(bundle);
        return f;
    }
}

MainActivity is

public class MainActivity extends AppCompatActivity {

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

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                if (position == 1) {
                    PreviewFragment fragmentB = new PreviewFragment();
                    EditFragment ef = EditFragment.newInstance();
                    try{
                        Log.e("ACTIVITY", ef.getArguments().getString("md"));// Data is available
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                    fragmentB.b_updateText(ef.getArguments().getString("md"));

                }
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    private class MyPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int pos) {
            switch(pos) {

                case 0: return EditFragment.newInstance();
                case 1: return new PreviewFragment();
                default: return EditFragment.newInstance();
            }
        }

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

but Here I get NPE, don't know why.

Logical Error
  • 207
  • 1
  • 2
  • 14

3 Answers3

0

Have you had a chance go through android docs?

Communicating with Other Fragments

Of course you can use Otto or EventBus library. And also have a look at this answer.

Community
  • 1
  • 1
Yurii Tsap
  • 3,554
  • 3
  • 24
  • 33
0

With FragmentManager, we can access another fragment from our current fragment by calling findFragmentByTag(<tag of target fragment>).

 // First Fragment, from we're sending data

public class MyFragmentA extends Fragment {

EditText A_input;
Button A_enter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View myFragmentView = inflater.inflate(R.layout.fragment_a, container, false);

A_input = (EditText)myFragmentView.findViewById(R.id.a_input);
A_enter = (Button)myFragmentView.findViewById(R.id.a_enter);
A_enter.setOnClickListener(A_enterOnClickListener);

return myFragmentView;
}

OnClickListener A_enterOnClickListener = new OnClickListener(){

@Override
public void onClick(View arg0) {

String textPassToB = A_input.getText().toString();

String TabOfFragmentB =  ((MainActivity)getActivity()).getTabFragmentB();

MyFragmentB fragmentB = (MyFragmentB)getActivity()
 .getSupportFragmentManager()
 .findFragmentByTag(TabOfFragmentB);

fragmentB.b_updateText(textPassToB);

Toast.makeText(getActivity(), 
 "text sent to Fragment B:\n " + TabOfFragmentB, 
 Toast.LENGTH_LONG).show();
}};

}

// Second Fragment, where we'll get data

public class MyFragmentB extends Fragment {

TextView b_received;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View myFragmentView = inflater.inflate(R.layout.fragment_b, container, false);

b_received = (TextView)myFragmentView.findViewById(R.id.b_received);
String myTag = getTag();

((MainActivity)getActivity()).setTabFragmentB(myTag);

Toast.makeText(getActivity(), 
"MyFragmentB.onCreateView(): " + myTag, 
Toast.LENGTH_LONG).show();

return myFragmentView;
}

public void b_updateText(String t){
b_received.setText(t);
}

}
Anshul Tyagi
  • 2,076
  • 4
  • 34
  • 65
0

Create a variable in MainActivity and access that variable from fragment through

 MainActivity  mainActivity = ( MainActivity) getActivity();
 mainActivity.message="Hai from EditFragment"

Check out the below code:

 public class MainActivity extends AppCompatActivity {
    public String message;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
            viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
        }

        private class MyPagerAdapter extends FragmentPagerAdapter {

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

            @Override
            public Fragment getItem(int pos) {
                switch(pos) {

                    case 0: return EditFragment.newInstance("FirstFragment, Instance 1");
                    case 1: {
                        Log.e("TAG", " is " + new EditFragment().getTag());
                        return PreviewFragment.newInstance(new EditFragment().getTag());
                    }

                    default: return EditFragment.newInstance("ThirdFragment, Default");
                }
            }

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

EditFragment is

  public class EditFragment extends Fragment {

            public EditFragment(){}

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View v = inflater.inflate(R.layout.fragment_editor, container, false);

                EditText tv = (EditText) v.findViewById(R.id.content);
                tv.setText(getArguments().getString("msg"));
            MainActivity  mainActivity = ( MainActivity) getActivity();
            mainActivity.message="Hai from EditFragment"
//store data through message variable inside activity
                return v;
            }


        }

PreviewFragment

 public class PreviewFragment extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.fragment_markdown, container, false);

            TextView tvView = (TextView) v.findViewById(R.id.markdownView);
            MainActivity  mainActivity = ( MainActivity) getActivity();

            tvView.loadMarkdown(mainActivity.message);// get data through message variable of main activity

            return v;
        }


    }
Rissmon Suresh
  • 13,173
  • 5
  • 29
  • 38