【问题标题】:Send String from Activty to ListFragment (Android Studio)将字符串从 Activity 发送到 ListFragment (Android Studio)
【发布时间】:2015-05-08 16:52:05
【问题描述】:

我的 MyActivity 包含三个片段:1 个 ListFragment (listFragmentTest) 和 2 个片段。 我的listFragmentTest 包含一个按钮。如果用户单击此按钮,它将启动一个新活动 (activityTest)。 这个activityTest 包含一个EditText 字段,用户可以在其中输入标题。

单击“保存”按钮(在activityTest 中)后,我想将字符串“标题”发送到listFragmentTest,并在我的listFragmentTest 的EditText 字段中显示标题。

这是来自我的activityTest 的按钮代码:

public void buttonSaveTitle(){
    saveButtonTitleToFragment = (Button) findViewById(R.id.save_button_title_to_fragment);
    saveButtonTitleToFragment.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditText editTextTitle = (EditText) findViewById(R.id.edit_text_title_activity);
            String title = editTextTitle.getText().toString();
            //And here: Send the String to the listFragment
        }
    });
}

我是 android 开发的新手,我尝试了意图和捆绑,但没有解决方案。


编辑

我不能使用findFragmentById。 ListFragment 没有 Id,因为它只是一个 Tab。我搜索并发现我必须使用FragmentTransaction.add 设置标签。但我不知道在我的项目中我必须在哪里插入FragmentTransaction.add。 或者有没有不使用 id 或 tag 的其他解决方案?

【问题讨论】:

    标签: android android-fragments android-activity


    【解决方案1】:

    This answer。它使用startActivityAsResultsetResult 发回数据。

    【讨论】:

      【解决方案2】:

      你可以把bundle放在Fragment中

      MyFragmentClass mFrag = new MyFragmentClass();
      Bundle bundle = new Bundle();
      bundle.putString("somekey", "someValue");   
      mFrag.setArguments(bundle);
      
      getSupportFragmentManager().beginTransaction().replace(R.id.someFrag, mFrag).commit();
      

      【讨论】:

        【解决方案3】:

        你可以把Bundle放在Fragment中

        MyFragmentClass mFrag = new MyFragmentClass();
        Bundle bundle = new Bundle();
        bundle.putString("somekey", "someValue");   
        mFrag.setArguments(bundle);
        
        getSupportFragmentManager().beginTransaction().replace(R.id.someFrag, mFrag).commit();
        

        从包中检索值

        Bundle bundle = this.getArguments();
        String val = bundle.getString("someValue", "");
        

        【讨论】:

          【解决方案4】:

          启动activityTest作为结果启动它并将数据发送回之前的Activity

          int REQUEST_TITLE = 12345;
          
          private void pickTitle() {
              Intent pickTitleIntent = new Intent(MyActivity.this, activityTest.class);
              startActivityForResult(pickTitleIntent, REQUEST_TITLE);
          }
          

          在你的activityTest 完成后执行此操作

          Intent returnIntent = new Intent();
          returnIntent.putExtra("title", title);
          setResult(RESULT_OK, returnIntent);
          finish();
          

          在您的activityTest 中收听结果并更新您的片段

          @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              // Check which request we're responding to
              if (requestCode == REQUEST_TITLE ) {
                  // Make sure the request was successful
                  if (resultCode == RESULT_OK) {
                     // Get the string
                     String title = data.getString("title");
                     MyFragment myFrag = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.my_fragment);
                     myFrag.updateTitle(title);
                  }
              }
          }
          

          【讨论】:

          • 非常感谢您的回答! :) 我不明白if (requestCode == ENTER_TITLE) 这条线。我应该输入什么而不是“ENTER_TITLE”?
          • 对不起。 REQUEST_TITLE ... 或任意命名。这只是一个整数。我建议您创建一个类 RequestCodes 并将其作为公共静态放入,以便您可以在任何地方访问它。确保请求时和获得结果时的值相同
          • 谢谢!我现在就试试你的版本:)
          【解决方案5】:

          使用Id或TAG查找Fragment,然后调用定义好的方法。

          如:

            MyFragment myFrag = (MyFragment)
                                getSupportFragmentManager().findFragmentById(R.id.my_fragment);
          myFrag.updateString(string);
          

          updateString 将是您在片段中自己定义的用于更新 UI 的方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-08
            • 2017-02-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多