Android: fragment 之间的 onActivityResult() 未按预期工作

标签 android android-fragments

这是从 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/

相关文章:

java - 如何将Map值添加到ArrayList中?

java - 如何仅在选中时在 ViewPager 中加载 fragment

Android onOptionsItemSelected 无法运行

java - 无法恢复嵌套 fragment 状态

android - 在应用程序崩溃时将堆栈跟踪信息从 Android 应用程序发送到后端服务器

android - 不断更新 RecyclerView 项目

Android 后台服务从 sharedpreferences 检查 url

java - 在 AsyncTask 的 doInBackground() 方法中使用这些变量是否安全?

android - fragment 中不合适的上下文菜单

java - 1 个 Activity 上的操作按钮?