簡體   English   中英

如何從片段到父活動獲取數據並將其傳遞給后台活動?

[英]How to get data from fragment to parent activity & pass it to back activity?

流程怎么樣?

Activity 1 -----> Activity 2 (containing/inside) ------> Fragment

我想要實現什么?

Fragment (sends some data back to Activity 2) ----> Activity 2 (onBackPressed : collects that data & send it back to Activity 1) ---> Activity 1

我應該如何實現上述目標。 我真的不想使用任何變量/常量來緩存片段數據。 需要知道任何內置方法來處理這個?

此外,

  • 活動2在其中加載Fragment。
  • 在onBackPressed中,我在Activity 2中使用setResult來使用Activity 1中的startActivityForResult進行標准數據傳遞。
  • 此外,如果我在Fragment中編寫任何方法並使用活動2調用,那么由於來回處理,將出現WHITE屏幕。 所以,真的不想編寫自己的方法,需要在離開Fragment時管理它。

您應該使用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
       }
    }
}

希望能幫助到你。

從數據傳遞Activity 2Activity 1可以使用startActivityForResult()Activity 1開始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);
}

我按照以下方式練習

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

並在片段中

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

從您的FirstActivity使用startActivityForResult()方法調用SecondActivity

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

在SecondActivity中,將要返回的數據設置為SecondActivity onBackPressed的SecondActivity。

 @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發送到Second活動,您可以使用接口回調

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

將此偵聽器實現為Second活動

嘗試這樣做:

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
    }

}

希望能幫助到你!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM