【问题标题】:How do I send a String from Activity to Fragment如何将字符串从 Activity 发送到 Fragment
【发布时间】:2019-11-20 10:10:31
【问题描述】:

我一直在开发一个应用程序,用户将登录到一个活动中,并且会有一个包含“我的个人资料”“主页”和“设置”片段的导航抽屉。在登录时,我正在传递从数据库中检索到的帐户的“名称”和“电子邮件”,因此我可以将其显示在“我的个人资料”片段中,但我无法将在登录活动中检索到的名称传递给我的个人资料片段。

来自登录活动的代码

    Bundle bundle = new Bundle();
    bundle.putString("first", extraName);
    ProfileFragment myProfile = new ProfileFragment();
    myProfile.setArguments(bundle);

来自 ProfileFragment 的代码

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle bundle = this.getArguments();
            String name = bundle.getString("first");
            Log.i("PASSED: ","hello " + name);
            Toast.makeText(getActivity(),"Hello " + name, Toast.LENGTH_SHORT);
        return inflater.inflate(R.layout.fragment_js_profile, container, false);
}

我总是得到错误空对象引用

Process: com.example.myapplication, PID: 31888

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
    at com.example.myapplication.JobSeeker.ProfileFragment.onCreateView(ProfileFragment.java:27)

    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

谢谢你,抱歉英语不好。

【问题讨论】:

  • Log.i("PASSED: ","hello " + handle);这里的句柄是什么???
  • bundle好像是空的,用hasExtra方法检查是否有字符串
  • @Jeeva,抱歉,必须是 NAME
  • 如何添加 ProfileFragment?
  • @Bracadabra 添加 ProfileFragment 是什么意思?对不起。这是一项活动中的一个片段,我刚刚从 youtube 上的教程中得到它。现在我似乎无法将数据从 Activity 传递到 Fragment

标签: android android-fragments fragment android-fragmentactivity


【解决方案1】:

请注意,您的片段在同一个活动或不同活动中。
根据您的问题,您的片段代码位于您尝试打​​印或获取字符串的错误 methodfunction 中,即使未创建 view

override onActivityCreated() 方法在您的片段中,并将这些代码行放入其中。

Bundle bundle = this.getArguments();
            String name = bundle.getString("first");
            Log.i("PASSED: ","hello " + name);
            Toast.makeText(getActivity(),"Hello " + name, Toast.LENGTH_SHORT);

并且不要打扰您的 onCreateView() 方法中的任何内容,只需剪切这些代码行上方并粘贴到 onActivityCreated()

【讨论】:

  • 我的片段在 HomeActivity 中,在 LoginActivity 上登录后访问。数据位于片段所在的 Home Activity 中,但我无法从 Java 类“ProfileFragment.java”访问它
  • 所以你在技术上说你有两个活动..一个用于登录和其他有片段的活动。正确的?请告诉我,您是否尝试过上述解决方案
  • 是的,我试过了,但还是不行 :( 不过谢谢。我刚刚在 youtube 的帮助下用片段创建了这个导航抽屉,但并不完全了解它是如何工作的
  • 好吧,现在再努力一点,更新你的问题并添加你所有的 XML 代码,你所有的片段和活动的完整代码以及类名。那么你的观点就会更容易理解了。
【解决方案2】:
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view= inflater.inflate(R.layout.fragment_js_profile, container, false);
    Bundle bundle = getArguments();
            String name = bundle.getString("first");
            Log.i("PASSED: ","hello " + name);
            Toast.makeText(getActivity(),"Hello " + name, Toast.LENGTH_SHORT);
        return view;

【讨论】:

    【解决方案3】:

    感谢您的所有回答,我的错误出现在 Switch Case 代码中

                case R.id.nav_profile:
                String name = getIntent().getStringExtra("name");
                Bundle bundle = new Bundle();
                bundle.putString("name", name);
                profileFragment.setArguments(bundle);
                manager.beginTransaction().replace(R.id.fragment_container, new ProfileFragment())
                        .commit();
                break;
    

    很抱歉没有早点发布这个,我在 onCreate 方法上发送数据,我把 NEW ProfileFragment() 继续创建一个新的片段,它应该是这样的

                case R.id.nav_profile:
                String name = getIntent().getStringExtra("name");
                ProfileFragment profileFragment = new ProfileFragment();
                Bundle bundle = new Bundle();
                bundle.putString("name", name);
                profileFragment.setArguments(bundle);
                manager.beginTransaction().replace(R.id.fragment_container, profileFragment)
                        .commit();
                break;
    

    您的所有答案都有帮助!谢谢你:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多