这是从 fragment A
获取 fragment B
的代码。
private void gotoFragmentB() {
FragmentB fragment = new FragmentB();
fragment.setTargetFragment(this, CODE_PATTERN_AND_PIN);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.addToBackStack(null);
transaction.replace(R.id.main_frame, fragment);
transaction.commit();
}
这是从 fragment B
到 fragment C
的代码。
private void gotoFragmentC(String pattern) {
Bundle bundle = new Bundle();
bundle.putString(Keys.VALUE, pattern);
bundle.putInt(Keys.OPTION, Keys.OPTION_PIN_AND_PATTERN);
FragmentC fragment = new FragmentC();
fragment.setTargetFragment(this, getTargetRequestCode());
fragment.setArguments(bundle);
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.main_frame, fragment);
transaction.commit();
}
最后,此代码从 Fragment C
获取 Fragment A
。
private void gotoFragmentA(String pin, String pattern) {
Intent intent = new Intent();
intent.putExtra(Keys.VALUE, pin);
intent.putExtra(Keys.PATTERN, pattern);
getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_OK, intent);
Log.i(ApplicationManager.LOG, "The request code is " + getTargetRequestCode());
Log.i(ApplicationManager.LOG, "Sending " + pin + " and " + pattern);
getFragmentManager().popBackStack();
closeSoftKeyboard();
}
根据上面的代码,我成功地将数据从Fragment A
传递到Fragment B
,并从Fragment B
传递到 >C fragment
也是如此。但问题是,我未能将数据从 Fragment C
返回到 Fragment A
。
在最后一个代码 fragment 中,我收到如下 Log
消息。
01-04 17:52:12.316 18694-18694/com.m I/MyAlarmApp: The request code is 103
01-04 17:52:12.326 18694-18694/com.m I/MyAlarmApp: Sending 1234 and 004-000&003-001&002-002&001-003&000-004&001-004&002-004&003-004&004-004
所以,我相信目前可能是 onActivityResult()
方法编码错误。这是目前为止的情况。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK && data != null) {
switch(requestCode) {
case CODE_PATTERN_AND_PIN:
alarmPIN = data.getStringExtra(Keys.VALUE);
pattern = data.getStringExtra(Keys.PATTERN);
Log.i(ApplicationManager.LOG, "PIN set to " + alarmPIN);
itemAlarmLock.setSubtitle(getString(R.string.pattern));
break;
}
}
}
最佳答案
只需使用监听器(接口(interface))在 fragment 之间传递信息。 OnActivityResult 在 Activity 间通信中更有用。
示例:假设您有两个 fragment A、B 和一个 Activity ,并且您需要将数据从 B 传递到 A。 然后在B中创建一个接口(interface),并将数据传递给Main Activity。在那里创建另一个接口(interface)并将数据传递给 fragment A。
fragment A 应如下所示:
public class FragmentA extends Fragment implements InterfaceDataCommunicatorFromActivity {
public InterfaceDataCommunicatorFromActivity interfaceDataCommunicatorFromActivity;
String data;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void updateData(String data) {
// TODO Auto-generated method stub
this.data = data;
//data is updated here which is from fragment B
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try {
interfaceDataCommunicatorFromActivity = (InterfaceDataCommunicatorFromActivity) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement TextClicked");
}
}
}
FragmentB 应如下所示:
class FragmentB extends Fragment {
public InterfaceDataCommunicator interfaceDataCommunicator;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
// call this inorder to send Data to interface
interfaceDataCommunicator.updateData("data");
}
public interface InterfaceDataCommunicator {
public void updateData(String data);
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try {
interfaceDataCommunicator = (InterfaceDataCommunicator) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement TextClicked");
}
}
}
主要 Activity 应该如下:
public class MainActivity extends Activity implements InterfaceDataCommunicator {
public InterfaceDataCommunicatorFromActivity interfaceDataCommunicatorFromActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void updateData(String data) {
// TODO Auto-generated method stub
interfaceDataCommunicatorFromActivity.updateData(data);
}
public interface InterfaceDataCommunicatorFromActivity {
public void updateData(String data);
}
}
关于Android: fragment 之间的 onActivityResult() 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41459854/