Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过回调将数据传递给片段的活动_Android_Android Activity_Android Fragments_Callback_Android Fragmentactivity - Fatal编程技术网

Android 通过回调将数据传递给片段的活动

Android 通过回调将数据传递给片段的活动,android,android-activity,android-fragments,callback,android-fragmentactivity,Android,Android Activity,Android Fragments,Callback,Android Fragmentactivity,我这里有个情况 我有一个fragmentactivity,它保存一个片段。当我点击片段中的一个按钮时,我将进入一个活动。当我到达活动时,我会做一些事情,这将影响我来自的片段中显示的数据。因此,为了在片段中进行更改,我想从活动回调到片段。首先,我想到在ActivityResult上实现。但我意识到这不是我需要的 是我的方法错了吗??请引导我 MyActivity extends FragmentActivity 我的活动有效 MyFragment extends Fragment 从这里我要去

我这里有个情况

我有一个
fragmentactivity
,它保存一个
片段
。当我点击
片段
中的一个按钮时,我将进入一个
活动
。当我到达活动时,我会做一些事情,这将影响我来自的
片段中显示的数据。因此,为了在片段中进行更改,我想从
活动
回调到
片段
。首先,我想到在ActivityResult上实现
。但我意识到这不是我需要的

是我的方法错了吗??请引导我

MyActivity extends FragmentActivity
我的活动有效

MyFragment extends Fragment
从这里我要去

SecondActivity extends Activity
SecondActivity
我需要得到一个到
MyFragment
的回调。我的方法有什么问题吗

编辑:

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();

    }
}

如果我正确理解您的情况,那么处理通信的正确方法是让SecondActivity将信息传回MyActivity,MyActivity将直接配置MyFragment的实例。除非片段附加到活动,否则您不希望访问活动中的片段

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, INTENT_CODE);
至于如何进行沟通,正如您所建议的,一种方法是使用startActivityForResult()。有关更多详细信息,请参阅此答案:

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

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, INTENT_CODE);
从片段到活动通信的最佳实践方式是在片段中定义一个接口,该接口由活动实现

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() {

    }
}

片段然后简单地将引用强制转换为它所附加到的活动,知道该活动必须实现侦听器,从而允许您在其他活动中重用片段。

参考此问题,它将帮助您了解发生了什么:

使用界面处理来自的回调
startActivityForResult
fragment@Raghunandan我先告诉你我是怎么想的。但我意识到我是wrong@edwin怎么了?@BaZinga我如何制作接口将数据推回到片段。我想到了。但我对实现逻辑一无所知。如果你不介意的话,你能详细说明一下吗?我试过这个。但onActivityResult在转到第二个Activity之前被触发。当返回到FragmentNothing时,ActivityResult上的链接也在FragmentActivity中实现。这是否会影响通过FragmentActivity使用的其他片段??在onActivityResult(int requestCode、int resultCode、Intent data)方法中,是否检查resultCode是否与Intent(Intent_代码)中设置的相同?可能还有其他的意图,你会希望以不同的方式处理。另外,请检查我对我的帖子所做的编辑,在创建意图时,您可能传递了对片段的引用,这可以解释为什么没有调用您的活动的onActivityResult()。因此,您建议我在FragmentActivity中处理onActivityResult。并将数据从FragmentActivity推送到我需要回调的片段。如果我错了,请纠正我。在FragmentActivity中处理意图。在FragmentActivity中,您应该有一个对片段的引用,这样您就可以直接调用它来配置它。