将字符串从 Activity 传递回 运行 片段 Android
Passing String from Activity back to running Fragment in Android
关于类似问题有一些帖子,但我没有得到正确的答案,我希望任何人都可以帮助我。
情况:
我有一个包含多个片段的 MainActivity
。在一个片段中,我开始一个 CameraActivity
的意图。当用户拍照后,CameraActivity
会用 finish()
关闭,我们 return 回到上一个片段。
目标:
我给图片起了一个特定的名字,并想将这个名字从 CameraActivity
传递给片段。
问题:
即使我在 CameraActivity 中调用 finish()
并且屏幕 return 返回到前一个片段,方法 onSaveInstanceState(Bundle outstate)
也从未被调用。这是为什么?
否则我该如何解决问题?
这是我的代码:
public class CameraActivity extends Activity {
// more code here
String imageFileName;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// some methods here
finish(); // finish the current Activity and get back to previous Fragment
}
// more code here
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.d(TAG_LOG, "onSaveInstanceState() called"); // is never called!
outState.putString("imageFileName", imageFileName);
super.onSaveInstanceState(outState);
}
}
我在片段中这样做:
public class MapFragment extends Fragment implements View.OnClickListener {
// more code here
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_map, container, false);
// some methods here
if (savedInstanceState != null) {
String imageFileName = getArguments().getString("imageFileName");
Log.d(TAG_LOG, "image filename: " + imageFileName);
}
return view;
}
// more code here
}
非常感谢任何帮助!
使用 startActivityForResult() 启动 CameraActivity,一旦您获得要在上一个屏幕中传回的字符串,只需创建一个包含该字符串的 Intent,然后在您的 MainActivity 中, 实施:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
从意图中获取字符串,并将其传递给您的片段。
onSaveInstanceState用于其他目的。
你应该看看 startActivityForResults
。这是一个简短的例子(没试过,但你会明白的):
片段
Intent intent = new Intent(MainActivity.this,CameraActivity.class);
getActivity().startActivityForResult(intent,RESULT_PIC_TAKEN); // you may start an activity from another activity, not a fragment
CameraActivity
Intent results = new Intent();
results.putExtra("com;yourpackage.PIC_NAME", picName);
setResult(CameraActivity.RESULT_OK,results);
finish();
返回 MainActivity(因为您调用了 getActivity()
)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RESULT_PIC_TAKEN) {
if(resultCode == Activity.RESULT_OK){
Bundle results = data.getExtras();
String picName = results.getString("com.yourpackage.PIC_NAME");
// code, and send what you want to the fragment
}
}
}
希望对您有所帮助!
关于类似问题有一些帖子,但我没有得到正确的答案,我希望任何人都可以帮助我。
情况:
我有一个包含多个片段的 MainActivity
。在一个片段中,我开始一个 CameraActivity
的意图。当用户拍照后,CameraActivity
会用 finish()
关闭,我们 return 回到上一个片段。
目标:
我给图片起了一个特定的名字,并想将这个名字从 CameraActivity
传递给片段。
问题:
即使我在 CameraActivity 中调用 finish()
并且屏幕 return 返回到前一个片段,方法 onSaveInstanceState(Bundle outstate)
也从未被调用。这是为什么?
否则我该如何解决问题?
这是我的代码:
public class CameraActivity extends Activity {
// more code here
String imageFileName;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// some methods here
finish(); // finish the current Activity and get back to previous Fragment
}
// more code here
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.d(TAG_LOG, "onSaveInstanceState() called"); // is never called!
outState.putString("imageFileName", imageFileName);
super.onSaveInstanceState(outState);
}
}
我在片段中这样做:
public class MapFragment extends Fragment implements View.OnClickListener {
// more code here
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_map, container, false);
// some methods here
if (savedInstanceState != null) {
String imageFileName = getArguments().getString("imageFileName");
Log.d(TAG_LOG, "image filename: " + imageFileName);
}
return view;
}
// more code here
}
非常感谢任何帮助!
使用 startActivityForResult() 启动 CameraActivity,一旦您获得要在上一个屏幕中传回的字符串,只需创建一个包含该字符串的 Intent,然后在您的 MainActivity 中, 实施:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
从意图中获取字符串,并将其传递给您的片段。
onSaveInstanceState用于其他目的。
你应该看看 startActivityForResults
。这是一个简短的例子(没试过,但你会明白的):
片段
Intent intent = new Intent(MainActivity.this,CameraActivity.class);
getActivity().startActivityForResult(intent,RESULT_PIC_TAKEN); // you may start an activity from another activity, not a fragment
CameraActivity
Intent results = new Intent();
results.putExtra("com;yourpackage.PIC_NAME", picName);
setResult(CameraActivity.RESULT_OK,results);
finish();
返回 MainActivity(因为您调用了 getActivity()
)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RESULT_PIC_TAKEN) {
if(resultCode == Activity.RESULT_OK){
Bundle results = data.getExtras();
String picName = results.getString("com.yourpackage.PIC_NAME");
// code, and send what you want to the fragment
}
}
}
希望对您有所帮助!