Home > database >  How to send data from Activity to Fragment using Interface and without the transaction?
How to send data from Activity to Fragment using Interface and without the transaction?

Time:10-19

I want to send the data from MainActivity to Fragment but i don't want to pass the data in the arguments when i am making the transaction to the fragment like below:

val bundle = Bundle()
bundle.putString("name", name)
val fragment = BlankFragment(this)
fragment.arguments = bundle
supportFragmentManager.beginTransaction().replace(R.id.fragmentView, fragment).commit()

I want to pass the data from the activity to the fragment using the interface. I am able to send the data from the fragment to the activity using the interface but not vice versa.

CodePudding user response:

You have an instance of a fragment in fragment, so provided it has a property name you can just say fragment.name = "name".

Note that when the app is restarted by the system after it is killed, the system will try to restore the fragment by calling it with empty constructor. So you can't have a constructor that have arguments, and also you won't get a name if you set it using fragment.name = "name". Using a bundle ensures that that the fragment gets its arguments after restart.

CodePudding user response:

I hope this can resolve your issue

Adding fragment to Activity

 val interfaceCall:FetchDataInterface = DataFragment.newInstance("data")
        interfaceCall.getData("data from interface")
        supportFragmentManager.beginTransaction()
            .replace(R.id.frame, DataFragment.newInstance("data"))
            .commit()

Fragment Class

class DataFragment : Fragment(),MainActivity.FetchDataInterface {
// TODO: Rename and change types of parameters
private var param1: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        param1 = it.getString(DATA)
        Log.e("checkParam", " : $param1")
    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?,
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_data, container, false)
}

companion object {
    // TODO: Rename and change types and number of parameters
    @JvmStatic
    fun newInstance(value: String) =
        DataFragment().apply {
            arguments = Bundle().apply {
                putString(DATA, value)
            }
        }
}

override fun getData(value: String) {
    Log.e("checkParam", " interface: $value")
}

}

Interface

 interface  FetchDataInterface{
    fun getData(value:String)
}

CodePudding user response:

Tryout this onces

In activity.....

 TextEditorDialogFragment textEditorDialogFragment =
                TextEditorDialogFragment.show(this, text, colorCode);

In Fragment....

public class TextEditorDialogFragment extends DialogFragment {

   public static final String TAG = TextEditorDialogFragment.class.getSimpleName();
   String inputText;
   int colorCode;

   public static TextEditorDialogFragment show(@NonNull AppCompatActivity appCompatActivity, @NonNull String inputText_, @ColorInt int colorCode_) {
        inputText =inputText_;
        colorCode=colorCode_;
        TextEditorDialogFragment fragment = new TextEditorDialogFragment();
        fragment.show(appCompatActivity.getSupportFragmentManager(), TAG);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.add_text_dialog, container, false);
    }
}
  • Related