如何从Fragment获取数据并将其传递给父Activity,然后传递到后面的Activity?

4

流程如何进行?

Activity 1 -----> 包含/内部的Activity 2 ------> Fragment

我想要实现什么?

Fragment (向Activity 2发送一些数据) ----> Activity 2 (onBackPressed : 收集该数据并将其发送回Activity 1) ---> Activity 1

如何实现上述操作。我真的不想使用任何变量/常量来缓存片段数据。需要知道任何内置方法来处理这个问题吗?

此外,

  • Activity 2在其中加载片段。
  • 在onBackPressed中,我正在使用Activity 2中的setResult进行标准数据传递,使用Activity 1中的startActivityForResult。
  • 另外,如果我在片段中编写任何方法,并从Activity 2中调用,则由于前后过程的原因,会出现一个白屏。所以,我真的不想编写自己的方法,并且需要在离开Fragment时进行管理。

你想要发送什么类型的数据? - Reena
假设一个布尔值。 - VVB
访问此链接。它是关于片段的,但可能会对您有所帮助。 - Shweta Chauhan
5个回答

1

您应该使用以下方式使用startActivityForResult启动Activity2:

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, requestCode);

在Activity2/fragment中,您应该按照以下方式完成活动;
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
getActivity().setResult(Activity.RESULT_OK,returnIntent);
getActivity().finish()

在Activity1中获得以下结果;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (this.requestCode == requestCode) {
        if(resultCode == Activity.RESULT_OK){
        //Get result
       }
    }
}

希望它有所帮助。

onActivityResult中你检查了条件if(requestCode == requestCode),为什么需要检查它?它总是为真。 - Manohar
1
第一个参数是 startActivityForResult(i,requestCode) 中的 requestCode;因此可以像下面这样: if (this.requestCode == requestCode)感谢您的警告。 - oyenigun

0

要将数据从Activity 2传递到Activity 1,您可以在Activity 1中使用startActivityForResult()启动Activity 2 , 并使用onActivityResult()Activity 1中接收该数据。

要将数据从Fragment传递到Activity 2,建议使用一些接口,比如

interface OnSomeDataListener {
    void onSomeData(SomeData data);
}

然后在片段中实现此接口的setter方法,例如

public void setOnSomeDataListener(OnSomeDataListener listener) {
    this.listener = listener;
}

然后在 Activity 中,当实例化一个 Fragment 时:

YourFragment fragment = new YourFragment();
fragment.setOnSomeDataListener(new OnSomeDataListener() {
    void onSomeData(SomeData data) {
        //return the result
        Intent intent = new Intent();
        intent.putExtra("data", data);
        setResult(RESULT_OK, intent);
        finish();
    }
}

最后,在片段中,当您想要将一些数据返回给Activity时:
if(listener != null) {
    listener.onSomeData(dataToReturn);
}

0

我是这样实现的

在Activity中编写setter和getter方法

public String getFilePath() {
    return filePath;
}
public void setFilePath(String filePath) {
    this.filePath = filePath;
}
public String getFileName() {
    return fileName;
}
public void setFileName(String fileName) {
    this.fileName = fileName;
}

并且在Fragment中

 filePath = ((YourActivity) getActivity()).getFilePath();
 fileName=((YourActivity) getActivity()).getFileName(); 

如果您在多个活动中使用相同的片段,可以为该片段创建一个构造函数,并传递上下文并检查上下文属于哪个活动

 public class BookmarkFragment extends Fragment {


private String filePath;
private String fileName;

Context contextCheckClass;

 public BookmarkFragment(Context ctx ) {

     this.contextCheckClass=ctx;

}

@SuppressLint("InflateParams")
   @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

     group= (View)inflater.inflate(R.layout.fragment_bookmark, null);

     if(contextCheckClass instanceof FirstReaderScreen){
     filePath = ((FirstReaderScreen) getActivity()).getFilePath();
     fileName=((FirstReaderScreen) getActivity()).getFileName();    
    // ispurchased=((FirstReaderScreen) getActivity()).isIspurchased(); 
     }
     else if(contextCheckClass instanceof MainReaderScreen){
         filePath = ((MainReaderScreen) getActivity()).getFilePath();
         fileName=((MainReaderScreen) getActivity()).getFileName(); 
    //   ispurchased=((MainReaderScreen) getActivity()).isIspurchased();    
     }
    return group;
}

用于调用片段

BookmarkFragment bookmarkFragment=new BookmarkFragment(FirstReaderScreen.this);
    getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.LL_Fragment, bookmarkFragment)//LL_fragment is container
    .addToBackStack(null)
    .commit();

0
从你的FirstActivity使用startActivityForResult()方法调用SecondActivity。
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

在你的SecondActivity中,在SecondActivity的onBackPressed方法中设置要返回到FirstActivity的数据。
 @Override
    public void onBackPressed() {
        super.onBackPressed();
       Intent returnIntent = new Intent();
        returnIntent.putExtra("result",result);
        returnIntent.putExtra("bool",true);
        setResult(Activity.RESULT_OK,returnIntent);
        finish();
    }

现在在你的FirstActivity类中编写以下代码,用于onActivityResult()方法。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
            boolean bool = data.getBooleanExtra("bool"); 

        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}//

要将数据从 Fragment 发送到第二个活动,您可以使用接口回调

 public interface sendDataListener
    {
        void sendData(boolean foo);
    }

在第二个活动中实现此监听器


0

尝试做这个:

public class MyFragment extends Fragment{
   private MyFragmentCommunicator myFragmentCommunicator;
   ....
   myFragmentCommunicator.sendDataToActivity(name, image, isSend);

   @Override
   public void onAttach(Activity activity) {
      super.onAttach(activity);
      myFragmentCommunicator = (MyFragmentCommunicator)activity;
   }
}

然后声明您的接口:

public interface MyFragmentCommunicator{
    void sendDataToActivity(String name, String image, boolean isSend);
}

然后在你的Activity中执行以下操作:

public class MyActivity extends AppCompatActivity implements MyFragmentCommunicator{

    @Override
    public void sendDataToActivity(String name, String image, String price) {
        //Manipulate the data
    }

}

希望能对你有所帮助!!!


onAttach()已被弃用。 - rookieDeveloper
onAttach(Activity activity)已经被弃用,但是可以使用带有Context的方法。 - user7157256

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接