【问题标题】:How can I call OnActivityResult inside Fragment and how it work?如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?
【发布时间】:2017-11-21 04:23:14
【问题描述】:

我想知道onActivityResult()是否可以在 Fragment 中使用,如果可以,那么它是如何工作的,请举例说明。

【问题讨论】:

  • 如果你从片段开始活动,你可以在活动中使用 OnActivityResult
  • 是的,你可以。在片段覆盖方法 onActivityResult 并注释 super.onActivityResult 并在此方法中执行您想要执行的操作。如果您不知道怎么做,请告诉我。
  • @RameshKumar 你能用例子解释一下吗?理解和实施对我来说很容易。
  • 您有什么要求?你要从片段或活动中调用 startActivityForResult() 吗?
  • 如果你要从fragment调用startActivityForResult(),那么你不应该调用“super.onActivityResult()”,这会调用fragment的activity的onActivityResult()。

标签: android android-intent fragment onactivityresult


【解决方案1】:

在您的片段中,您需要调用:

startActivityForResult(myIntent, MY_INTENT_REQUEST_CODE);

其中myIntent 是您已经定义的意图,MY_INTENT_REQUEST_CODE 是您在此片段中定义为全局变量的int 常量,作为此意图的请求代码。

然后,仍然在您的片段中,您需要重写此方法:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   //super.onActivityResult(requestCode, resultCode, data); comment this unless you want to pass your result to the activity.
}

【讨论】:

  • 我在片段中启动ActivityForResult,并希望在片段/活动中接收但onReceive数据始终为空。
  • 你能解释更多吗?那么什么是“我”?我需要在活动和片段中调用哪个命令?
【解决方案2】:

在活动中使用此代码。

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    Fragment fragment = (Fragment) getSupportFragmentManager().findFragmentByTag(childTag);
    if (fragment != null) {
        fragment.onActivityResult(requestCode, resultCode, intent);
    }
}

【讨论】:

    【解决方案3】:

    是的,您可以在 Fragment.like 中使用OnActivityResult

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    //super.onActivityResult(requestCode, resultCode, intent);
    // perform your action here
    }
    

    编辑

    欲了解更多信息,请查看这个老问题

    https://stackoverflow.com/a/17085889/7666442

    【讨论】:

      【解决方案4】:

      它肯定会起作用,它会像在活动中一样起作用。您已致电startActivityForResult(intent, requestCode); 并且通常会在

      中得到结果
      @Override
          public void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
      }
      

      【讨论】:

        【解决方案5】:

        如果你在 fragment 中调用 startActivityForResult(),结果会传递给父 Activity。

        public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);//will deliver result to desired fragment.
        }
        

        工作原理

        如果您在活动中看到 requestCode,它会像 655545,现在

        super.onActivityResult() 将计算所需的片段和请求代码。

        如果您在 ViewPager 中的片段使用

        找到所需片段索引
        requestCode>>16
        

        并且 requestCode 由 requestCode&0xffff 找到。

        【讨论】:

          【解决方案6】:
          In kotlin: - I can explain using two classes. if user go from one Activity to Another Activty and in back want data then this code help you
          
          In class Abc
          startActivityForResult(Intent(context, Bcd::class.java), 141)
          
            override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
                  if (requestCode == 141) {
                      if (data!!.extras.get("add").equals("safal")) {
                          Log.e("Print Name",data!!.extras.get("add"))
                      }
                  }
              }
          
          In Class Bcd
           val intent = Intent()
           intent.putExtra("add", "safal")
           setResult(Activity.RESULT_OK, intent)
          

          【讨论】:

            【解决方案7】:

            您可以在 android studio 3.5 的 Fragment 中轻松调用 onActivityResult

            ,首先,你应该有一个活动来获得结果。 OnActivity 结果意味着它必须在提示时给出结果视图。 现在在上一个活动中让我们说

            第一个是活动,另一个是第二个活动中的片段

            第一个活动的 XML 代码可能如下所示:

                 <RelativeLayout
                 xmlns:androclass="http://schemas.android.com/apk/res/android"  
                 xmlns:tools="http://schemas.android.com/tools"  
                 android:layout_width="match_parent"  
                 android:layout_height="match_parent"  
                 tools:context=".MainActivity" >  
                <TextView  
                android:id="@+id/t1"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_alignLeft="@+id/button1"  
                android:layout_alignParentTop="true"  
                android:layout_marginTop="48dp"  
                android:text="Default Message" />  
             <Button  
                android:id="@+id/b1"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_below="@+id/textView1"  
                android:layout_centerHorizontal="true"  
                android:layout_marginTop="42dp"  
                android:text="GetMessage" />  
                </RelativeLayout>  
            

            第二个 Xml 代码将是

                 <RelativeLayout xmlns:androclass="http://schemas.android.com/apk/res/android"  
                xmlns:tools="http://schemas.android.com/tools"  
               android:layout_width="match_parent"  
               android:layout_height="match_parent"  
               android:paddingBottom="@dimen/activity_vertical_margin"  
               android:paddingLeft="@dimen/activity_horizontal_margin"  
               android:paddingRight="@dimen/activity_horizontal_margin"  
               android:paddingTop="@dimen/activity_vertical_margin"  
               tools:context=".SecondActivity" >  
            <EditText  
                android:id="@+id/et1"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_alignParentTop="true"  
                android:layout_marginTop="61dp"  
                android:layout_toRightOf="@+id/textView1"  
                android:ems="10" />  
            <TextView  
                android:id="@+id/t1"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_alignBaseline="@+id/editText1"  
                android:layout_alignBottom="@+id/editText1"  
                android:layout_alignParentLeft="true"  
                android:text="Enter Message:" />  
            <Button  
                android:id="@+id/b1"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_below="@+id/editText1"  
                android:layout_centerHorizontal="true"  
                android:layout_marginTop="34dp"  
                android:text="Submit" />  
              </RelativeLayout>  
            

            现在我们将添加 startActivityForResult() 方法和 onActivityResult() 方法

                @Override
                public void onActivityResult(int requestCode, int resultCode, Intent data) {
            
                super.onActivityResult(requestCode, resultCode, data);
            
                if(requestCode==2)
                {
                    String message=data.getStringExtra("MESSAGE");
                    if (message!=null){
                        profileNameText.setText(message);
                    }
                  }
                 }
            
            
                 @Override
                public void onClick(View v) {
                Intent i ;
                switch (v.getId()){
                    case R.id.profile_option_menu:
                        Log.i("profileclicked","profile_menu_image_clicked()");
                        PopupMenu popupMenu = new PopupMenu(getActivity(),v);
                        MenuInflater inflater = popupMenu.getMenuInflater();
                        inflater.inflate(R.menu.profile_menu,popupMenu.getMenu());
                        popupMenu.show();
                        popupMenu.setOnMenuItemClickListener(new 
                        PopupMenu.OnMenuItemClickListener() {
                            @Override
                            public boolean onMenuItemClick(MenuItem item) {
                                Intent i;
                                switch (item.getItemId()) {
            
                                        case R.id.edit_det:
                                        i = new Intent(getActivity().getApplicationContext(), 
                                        FirstActivity.class);
                                        startActivityForResult(i, 2);
                                        return true;
                                    default:
                                        return onOptionsItemSelected(item);
                                }
                            }
                        });
                        break;
                }
            }
            

            第一个活动类的代码是这样的

                    public class FirstActivity extends Activity {  
                     EditText editText1;  
                     Button button1;  
                     @Override  
                      protected void onCreate(Bundle savedInstanceState) {  
                      super.onCreate(savedInstanceState);  
                      setContentView(R.layout.activity_first);  
                      editText1=(EditText)findViewById(R.id.et1);  
                      button1=(Button)findViewById(R.id.b1);  
                      button1.setOnClickListener(new OnClickListener() {  
                        @Override  
                        public void onClick(View arg0) {  
                            String message=editText1.getText().toString();  
                            Intent intent=new Intent();  
                            intent.putExtra("MESSAGE",message);  
                            setResult(2,intent);  
                            finish();//finishing activity  
                         }  
                     });  
                   }  
            

            在这里,我正在编写一个方法 setResult(2, intent),其中 2 是结果代码,它将在第一个活动类的片段内检查,它将检查结果代码,如果满足条件,那么它将更改内部的文本文本视图。

            【讨论】:

              【解决方案8】:

              在 Kotlin 中,我们可以通过以下非常简单的方式做到这一点:

              在 ExampleFragment.kt 中,让启动 Activity 来绘制图像。

              private val REQUEST_CODE_GALLERY = 101
              
              private fun openGallery() {
                  val intent = Intent(Intent.ACTION_PICK)
                  intent.type = "image/*"
              
                  requireActivity().startActivityFromFragment(this, intent, REQUEST_CODE_GALLERY)
              }
              
              override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
                  super.onActivityResult(requestCode, resultCode, data)
              
                  if(resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_GALLERY) {
                      Log.d("TAG", "${data.toString()}")
                  }
              }
              

              希望,这会有所帮助!

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-10-27
                • 2016-07-24
                • 2020-08-06
                • 2015-04-04
                • 2013-11-14
                相关资源
                最近更新 更多