android-fragments 如何在没有事务的情况下使用接口将数据从Activity发送到Fragment?

5m1hhzi4  于 2022-11-13  发布在  Android
关注(0)|答案(3)|浏览(158)

我想将数据从MainActivity发送到Fragment,但在向片段进行事务处理时,我不想在参数中传递数据,如下所示:

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

我想使用interface将数据从activity传递到fragment。我可以使用接口将数据从片段发送到Activity,但反之则不行。

pokxtpni

pokxtpni1#

你在fragment中有一个片段的示例,所以只要它有一个name属性,你就可以说fragment.name = "name"
请注意,当应用被杀死后被系统重新启动时,系统将尝试通过使用空构造函数调用它来恢复片段。因此,您可以使用can't have a constructor that have arguments,并且如果您使用fragment.name = "name"设置它,您也不会获得name。使用bundle可以确保片段在重新启动后获得其参数。

hof1towb

hof1towb2#

我希望这可以解决您的问题
正在将片段添加到活动

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

片段类

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  FetchDataInterface{
    fun getData(value:String)
}
i34xakig

i34xakig3#

试试这个吧
活动中.....

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

在片段中....

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);
    }
}

相关问题