【问题标题】:How can I pass a String between fragments?如何在片段之间传递字符串?
【发布时间】:2019-11-03 12:50:47
【问题描述】:

我知道已经有一些关于它的问题,但没有一个答案适合我。

我想将字符串 inputEmail 从 StartFragment 传递给 SignInFragment。

我尝试用捆绑包做到这一点:

StartFragment

SignInFragment fragmentTwo = new SignInFragment();
                Bundle bundle = new Bundle();
                bundle.putString("key", input_mail);
                fragmentTwo.setArguments(bundle);

SignInFragment:

View view = inflater.inflate(R.layout.fragment_sign_in, container, false);


    Bundle bundle = getArguments();
    if (bundle!=null) {
        String mail = bundle.getString("key");
    }
    else {
        Toast.makeText(getActivity(), "key not found", Toast.LENGTH_SHORT).show();
    }


    return view;

我已经发现问题在于找不到密钥,这就是应用程序一直崩溃的原因。所以我放了一个 if 子句来修复它,但我仍然没有得到字符串 inputEmail。

那么如何从 StartFragment SignInFragment 传递字符串 inputMail

提前谢谢你

【问题讨论】:

标签: java android string fragment


【解决方案1】:

当你传递一个参数时,它的类型也必须是String。相反,您传递一个Serializable 类型,然后尝试检索一个String 类型。请按如下方式更改您的代码:

SignInFragment fragmentTwo = new SignInFragment();
            Bundle bundle = new Bundle();
            bundle.putString("key", input_mail); // pass a String key, not a Serializable one
            fragmentTwo.setArguments(bundle);

【讨论】:

  • 确实如此。我现在改了。但是还是不行
  • @Marek 你是如何将你的SignInFragment 添加到后台的?
【解决方案2】:

您可以使用您的活动传递您的字符串:

StartFragment 中创建一个接口并在您的活动中实现它。

StartFragment:

public class StartFragment extends Fragment {
     private OnSignInListener onSignInListener;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //...

        if (onSignInListener != null)
            onSignInListener.onSignIn("email");
    }

    public void setOnSignInListener(OnSignInListener onSignInListener) {
        this.onSignInListener = onSignInListener;
    }

    public interface OnSignInListener{
        void onSignIn(String email);
    }
}

SignInFragment:

public class SignInFragment extends Fragment {

    private String email;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //...
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

您的活动:

public class MainActivity extends AppCompatActivity implements StartFragment.OnSignInListener {

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

        //...

        StartFragment startFragment = new StartFragment();
        startFragment.setOnSignInListener(this);

    }

    @Override
    public void onSignIn(String email) {
        SignInFragment signInFragment = new SignInFragment();
        signInFragment.setEmail(email);//set email

        //replace fragment
        //...
    }
}

【讨论】:

    猜你喜欢
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多