-1

I'm a beginner on Android and I have already read several topics on this issue, but I can not get this to work on my app.

I've two layouts :

  1. activity_home (android:id="@+id/home_container")
  2. activity_signs (android:id="@+id/signs_container").

I've two Activities :

  1. HomeActivity, nothing special :

    public class HomeActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); getSupportFragmentManager().beginTransaction() .replace(R.id.home_container, new HomeFragment()) .commit(); } }

  2. SignsActivity, where I want to save my values when rotating the smartphone :

    public class SignsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signs); if (savedInstanceState == null) { SignsFragment signsFragment = new SignsFragment(); signsFragment.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction() .replace(R.id.signs_container, signsFragment, "SIGNS_FRAGMENT_TAG") .commit(); } else { SignsFragment signsFragment = (SignsFragment)getSupportFragmentManager() .findFragmentByTag("SIGNS_FRAGMENT_TAG"); } } }

I've two Fragments :

  1. HomeFragment, where I want to send data :

    public class HomeFragment extends Fragment { String language; public HomeFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.activity_home, container, false); language = "french"; Button displayView = (Button) rootView.findViewById(R.id.display); if (displayView != null) { displayView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { EditText signView = (EditText) rootView.findViewById(R.id.sign_number); String signNumber = signView.getText().toString(); if (!signNumber.equals("")) { int number = Integer.parseInt(signNumber); Bundle bundle = new Bundle(); bundle.putString("language", language); bundle.putInt("signNumber", number); FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager() .beginTransaction(); SignsFragment signsFragment = new SignsFragment(); signsFragment.setArguments(bundle); fragmentTransaction.replace(R.id.signs_container, signsFragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } } }); } return rootView; } }

  2. SignsFragment, where I want to receive data :

    public class SignsFragment extends Fragment { private String language; private int signNumber; private View rootView; public SignsFragment() { // Required empty public constructor } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("language", language); outState.putInt("signNumber", signNumber); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Bundle bundle = getArguments(); if (bundle != null) { language = bundle.getString("language"); signNumber = bundle.getInt("signNumber", 1); } else { if (savedInstanceState != null) { // Restore last state language = savedInstanceState.getString("language"); signNumber = savedInstanceState.getInt("signNumber"); } else { language = "french"; signNumber = 1; } } return inflater.inflate(R.layout.activity_signs, container, false); } }

The app closes when I click the button on the home, while I want to retrieve the data in signs. Can anyone help me correct my mistake ?

Thank you in advance for your answers.

1 Answers1

0

I have one fragment, in which I have two Tabs, Which are again fragments. So i am moving from one tab to another tab and passing data. Here is the code. This Works Perfectly

  // write below code in Second Fragment from where you want to pass the values to nextFragment(i-e FirstFragment)
 // Write below code in OnClickListener of the button in secondFragment
  if (tablayout.getTabAt(1).isSelected()) { // here one is the index number of second fragment i-e current fragment
  LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext());
  Intent i = new Intent("EDIT_TAG_REFRESH");
  i.putExtra("Key1",value1);
  i.putExtra("Key2",value2);
  lbm.sendBroadcast(i);
   }
   tablayout.getTabAt(0).select(); // here 0 is the index number of first fragment i-e to whch fragment it has to move

// Write below code in First Fragment

MyReceiver post_r;
Context context;
String newValue;
public void refresh() {
    //your code in refresh.
    Log.i("PostRefresh", "Post:YES");
}

public void onPause() {
    super.onPause();

    LocalBroadcastManager.getInstance(context).unregisterReceiver(post_r);
}

public void onResume() {
    super.onResume();
    post_r = new MyReceiver();
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(post_r,
            new IntentFilter("EDIT_TAG_REFRESH"));
}
  // OnResuming get the details from second Fragment
private class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        YourFirstFragment.this.refresh(); // presend Fragment Name

        String action = intent.getAction();
        st_value1= intent.getStringExtra("Key1");
        st_value2= intent.getStringExtra("Key2");
       // EITHER SET THE VALUES HERE OR IN REFERESH METHOD

    }
}
Tara
  • 2,598
  • 1
  • 21
  • 30
  • Hello Tara, I tried, but I don't know how to receive the local broadcast. When I click on the button, nothing happens. I stay on the homepage, but the app doesn't close anymore. – C. Marquay May 15 '17 at 10:12
  • what is your requirement? I did this in on TabSelected. – Tara May 15 '17 at 10:16
  • `private Context mContext; ... private class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { mContext = context; SignsFragment.this.refresh(); language = intent.getStringExtra("language"); signNumber = intent.getIntExtra("signNumber", 1); } }` Did I do well ? – C. Marquay May 15 '17 at 10:21
  • you just need to pass the "key" not "value" as how we do in shared preferences. – Tara May 15 '17 at 10:25
  • I want to click on the button, and send the data of the edittext from the first layout for use for a display in a second layout. I don't know how to receive the data and display the second layout with the SignsFragment. – C. Marquay May 15 '17 at 10:26
  • Of course, like this : `language = intent.getStringExtra("language"); signNumber = intent.getIntExtra("signNumber", 1); ` – C. Marquay May 15 '17 at 10:29
  • signNumber = intent.getIntExtra("signNumber", 1); why you wre writing 1 here? – Tara May 15 '17 at 10:35
  • getIntExtra needs two values : the key and a default value. But I still need to display the activity_signs layout with the data it receives. – C. Marquay May 15 '17 at 11:57
  • put 0 instead of 1 – Tara May 15 '17 at 12:06
  • Hello Tara, Thank you for trying to help me. I don't understand why it can be helpful to change the default value in the second parameter, but I tried and nothing has changed. I already made an intent between activities before creating the fragments and it worked perfectly. I just want to send data in the same way, but between fragments now. I've tried FragmentTransaction and Bundle as I've shown it in my question, and I don't know how to receive a localbroadcast and display its data ... Someone has an idea to correct my code ? – C. Marquay May 15 '17 at 12:26