【问题标题】:Activity Passing Data to Fragment through callbacksActivity 通过回调将数据传递给 Fragment
【发布时间】:2013-11-18 04:19:58
【问题描述】:

我这里有个情况。

我有 FragmentActivty ,其中包含一个 Fragment 。当我单击 Fragment 中的按钮时,我将转到 Activty 。当我到达活动时我会做一些事情,这将影响我来自的Fragment 中显示的数据。因此,为了在片段中带来这种变化,我想从ActivityFragment 进行回调。首先我想到了实现onActivityResult。但我意识到这不是我需要的。

我的方法是错误的吗?请指导我

MyActivity extends FragmentActivity

MyActivity 持有

MyFragment extends Fragment

从这里开始

SecondActivity extends Activity

来自SecondActivity,我需要回调MyFragment。我的方法有什么问题吗??

编辑:

 public class MainActivity extends FragmentActivity {
    private FrameLayout frameLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        frameLayout = (FrameLayout) findViewById(R.id.framelayout);
         loadFragment();

    }

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

    private void loadFragment() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        MyFragment myFragment = new MyFragment();
        fragmentTransaction.add(R.id.framelayout, myFragment);
        fragmentTransaction.commit();

    }
}

MyFragment.java

public class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_view, container, false);
        Button button = (Button) view.findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                callActivity();

            }
        });

        return view;
    }



    private void callActivity() {
        Intent intent = new Intent(getActivity(), SecondActivity.class);
        startActivityForResult(intent, 10);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
//      super.onActivityResult(requestCode, resultCode, data);
        Log.e("MyFragment Inside", "Onresultttt");
        if (requestCode == 10) {
            if (resultCode == Activity.RESULT_OK) {
                Log.e("Result code", Activity.RESULT_OK + " okkk");
            }
            if (resultCode == Activity.RESULT_CANCELED) {
                Log.e("Result code", Activity.RESULT_CANCELED + "cancelll inside fragment");
            }
        }
    }
}

SecondActivity.java

public class SecondActivity extends Activity {
    private static final String TAG = "second activity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.secondactivity_view);
    }

    @Override
    public void onBackPressed() {
        // super.onBackPressed();
        Intent intent = new Intent();
        setResult(RESULT_CANCELED, intent);
        Log.e(TAG, "result setted");
        finish();

    }
}

【问题讨论】:

  • 使用接口处理回调
  • startActivityForResult 来自片段
  • @Raghunandan 我首先告诉我我想到了这一点。但我意识到我错了
  • @edwin 怎么了?
  • @BaZinga 如何制作接口以将数据推送回片段。我想到了。但我对实现逻辑一无所知。如果你不介意你能详细说明吗??

标签: android android-activity android-fragments callback android-fragmentactivity


【解决方案1】:

参考这个问题,它将帮助您了解正在发生的事情: onActivityResult is not being called in Fragment

【讨论】:

    【解决方案2】:

    如果我正确理解您的情况,那么处理通信的正确方法是让 SecondActivity 将信息传回给 MyActivity,而后者又会直接配置它的 MyFragment 实例。除非 Fragment 附加到 Activity,否则您不希望从 Activity 访问 Fragment。

    至于如何进行通信,正如您所建议的,一种方法是使用 startActivityForResult()。有关详细信息,请参阅此答案:How to manage `startActivityForResult` on Android?

    只是关于 startActivityForResult() 的注释。如果您从 Fragment 调用它,那么您的 Fragment 将收到结果,而不是您的 Activity。从 Fragment 调用 startActivityForResult() 还存在一些其他问题,因此我通常建议您改为从 Activity 调用它,从而处理来自 Activity 的结果。

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

    从 Fragment 到 Activity 通信的最佳实践方式是在 Fragment 中定义一个接口,该接口由 Activity 实现。

    public class MyFragment extends Fragment {
        public interface MyFragmentListener() {
            public void onMyFragmentEvent();
        }
    
        public void startTheActivityForResult() {
            ((MyFragmentListener)getActivity()).onMyFragmentEvent();
        }
    }
    
    public class MainActivity extends FragmentActivity implements MyFragmentListener{
        @Override public void onMyFragmentEvent() {
    
        }
    }
    

    Fragment 然后简单地将引用转换为它所附加的 Activity,知道 Activity 必须实现 Listener,从而允许您在其他 Activity 中重用 Fragment。

    【讨论】:

    • 好吧,我试过了。但是 onActivityResult 在去 secondActivty 之前被触发。回到片段时什么都没有发生
    • 链接 onActivityResult 也在 FragmentActivity 中实现。这会影响通过 FragmentActivity 使用的其他 Fragment 吗??
    • 在 onActivityResult(int requestCode, int resultCode, Intent data) 方法中,您是否检查 resultCode 是否与您在 Intent (INTENT_CODE) 中设置的相同?可能还有其他意图,您需要以不同的方式处理。另外,请检查我对帖子所做的编辑,您可能在创建 Intent 时传入了对 Fragment 的引用,这可以解释为什么您的 Activity 的 onActivityResult() 没有被调用。
    • 所以你建议我处理 FragmentActivity 中的 onActivityResult 。并将数据从 FragmentActivity 推送到我需要回调的片段。如果我错了,请纠正我
    • 正确。在 FragmentActivity 中处理 Intent。从 FragmentActivity 你应该有一个对你的 Fragment 的引用,所以你可以直接调用它来配置它。
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多