流程如何进行?
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在其中加载碎片。
- 在Onbackpressed中,我在活动2中使用setResult在活动1中使用标准数据通过活动1。
- ,如果我在片段中写下任何方法,&从Activity 2进行调用,然后将其用于/FRO过程,出现白屏。因此,真的不想写自己的方法&需要在离开碎片时进行管理。
您应该使用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()
并在下面获取活动1;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (this.requestCode == requestCode) {
if(resultCode == Activity.RESULT_OK){
//Get result
}
}
}
希望它有帮助。
要将数据从Activity 2
传递到Activity 1
,您可以在Activity 1
中使用startActivityForResult()
来启动Activity 2
,而onActivityResult()
中的CC_8可以接收该数据。
要将数据从Fragment
传递到Activity 2
,我建议使用一些接口,例如
interface OnSomeDataListener {
void onSomeData(SomeData data);
}
然后,将此接口的设置器方法用于
之类的片段public void setOnSomeDataListener(OnSomeDataListener listener) {
this.listener = listener;
}
,然后在活动中进行实例化 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();
}
}
最后,在片段中,当您想将一些数据返回到活动时:
if(listener != null) {
listener.onSomeData(dataToReturn);
}
从您的第一次攻击中使用startActivityForresult()方法
调用次数Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
在您的第二级设置您要返回到第二次攻击的数据。
。 @Override
public void onBackPressed() {
super.onBackPressed();
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
returnIntent.putExtra("bool",true);
setResult(Activity.RESULT_OK,returnIntent);
finish();
}
现在,在您的第一个练习类中,为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
}
}
}//
要将数据从片段发送到第二个活动,您可以使用接口回调
public interface sendDataListener
{
void sendData(boolean foo);
}
将此侦听器实现为第二个活动
尝试这样做:
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);
}
然后在您的活动中执行此操作:
public class MyActivity extends AppCompatActivity implements MyFragmentCommunicator{
@Override
public void sendDataToActivity(String name, String image, String price) {
//Manipulate the data
}
}
希望它有帮助!
我以以下方式获得
在活动中写下设定器和getters
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();
如果您在超过1个活动中使用了相同的片段,则可以为该片段创建一个构造函数,并通过上下文和检查上下文是哪个活动
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();