【问题标题】:startActivityForResult Crashes in fragmentstartActivityForResult 在片段中崩溃
【发布时间】:2018-09-05 08:03:39
【问题描述】:

调用startActvityResult()时发生错误。

我用它从其他片段中调用 FragmentFotosdePerfil

public void verFotosPerfil(String userID){

    fragmentFotosPerfil=new FragmentFotosPerfil();
    Bundle bundle= new Bundle();
    bundle.putString("userID",userID);
    fragmentFotosPerfil.setArguments(bundle);
    getFragmentManager().beginTransaction().
    replace(R.id.frameLayout2,fragmentFotosPerfil).commit();

}

我在不同按钮中使用 Onclick 从 XML 中调用“cargarFotoPerfil”

 public void cargarFotoPerfil(View view){


    switch(view.getId()) {
        case R.id.btnCargarFoto2:
            System.out.println("caso2");
          cargarFotoPerfil2(view);
            foto=2;
            break;
        case R.id.btnCargarFoto3:
            cargarFotoPerfil2(view);
            foto=3;
            break;
        case R.id.btnCargarFoto4:
            cargarFotoPerfil2(view);
            foto=4;
            break;

        case R.id.btnCargarFoto5:
            cargarFotoPerfil2(view);
            foto=5;
            break;

    }

    public void cargarFotoPerfil2(View view){

        final CharSequence[] opciones={"Elegir de Galeria","Cancelar"};
        final AlertDialog.Builder builder=new 
        AlertDialog.Builder(view.getContext());
        builder.setTitle("Elige una Opción");
        builder.setItems(opciones, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

                if (opciones[i].equals("Elegir de Galeria")){
                    Intent intent=new Intent(Intent.ACTION_PICK,
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    intent.setType("image/");  
                    startActivityForResult
                    (intent.createChooser(intent,"Seleccione"),10);
                }else{
                    dialogInterface.dismiss();
                }
            }

        });
        builder.show();
    }

这是我的 logcat 报告,如下所示。

//ERROR.CRASHES IN LINE startActivityForResult()

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.clemente.prueba6, PID: 4937
                  java.lang.IllegalStateException: Fragment FragmentFotosPerfil{18cbf6df} not attached to Activity
                      at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:1019)
                      at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:1010)
                      at com.example.clemente.prueba6.FragmentFotosPerfil$1.onClick(FragmentFotosPerfil.java:159)
                      at android.support.v7.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1067)
                      at android.widget.AdapterView.performItemClick(AdapterView.java:300)
                      at android.widget.AbsListView.performItemClick(AbsListView.java:1143)
                      at android.widget.AbsListView$PerformClick.run(AbsListView.java:3044)
                      at android.widget.AbsListView$3.run(AbsListView.java:3833)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5221)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

有人知道这个问题的解决方法吗?

提前致谢

【问题讨论】:

  • 处理活动的结果会好很多,所以最好运行if(getActivity()!=null) getActivity().startActivityForResult(intent.createChooser(intent,"Seleccione"),10);
  • 谢谢 gmetax,如果我使用 getActivity().startForResult... 它返回 null
  • 你在哪里打电话给cargarFotoPerfil2(View view)?发布完整代码。
  • 您的问题是您的片段未附加,您还必须使用您的 isAdded

标签: android camera startactivityforresult


【解决方案1】:

我相信你想以任何方式关闭对话框,它可能会修复你的崩溃......

尝试将onClick 更改为如下所示:

@Override
public void onClick(DialogInterface dialogInterface, int i) {

  dialogInterface.dismiss();

  if (opciones[i].equals("Elegir de Galeria")){
    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    intent.setType("image/");
    startActivityForResult(intent.createChooser(intent,"Seleccione"),10);
  }
}

【讨论】:

  • 谢谢 HedeH,但问题出在它运行 startActivityforResult 时。对话框运行,但是当我选择“Elegir Galeria”时它崩溃了
【解决方案2】:

使用 isAdded 检查片段是否附加到 Activity。

if(isAdded){

    final CharSequence[] opciones={"Elegir de Galeria","Cancelar"};
    final AlertDialog.Builder builder=new AlertDialog.Builder(view.getContext());
    builder.setTitle("Elige una Opción");
    builder.setItems(opciones, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

            if (opciones[i].equals("Elegir de Galeria")){
                Intent intent=new Intent(Intent.ACTION_PICK,
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setType("image/");
            startActivityForResult(intent.createChooser(intent,"Seleccione"),10);
            }else{
                dialogInterface.dismiss();
            }
        }

    });

}

【讨论】:

  • 它返回false,所以没有添加,我该如何解决?
  • 发布FragmentFotosPerfil.java 以便我们为您提供帮助。
【解决方案3】:

我认为您需要检查您的代码。因为我回复了片段并且您的代码运行良好。也许您的错误是您在 Activity 中加载片段的方式。

我给你我用来启动片段的代码。此代码正在运行。

TestFragment

调用另一个片段
     public class TestFragment extends Fragment {

    public TestFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
         View v = inflater.inflate(R.layout.fragment_test_two, container, false);

        TestFragmentTwo fragment = new TestFragmentTwo();
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();

        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.container, fragment);
        fragmentTransaction.addToBackStack(fragment.toString());
        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        fragmentTransaction.commit();

         return v;
    }
}

TestFragmentTwo

public class TestFragmentTwo extends Fragment {

    public TestFragmentTwo() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
         View v = inflater.inflate(R.layout.fragment_test_two, container, false);


        final CharSequence[] opciones={"Elegir de Galeria","Cancelar"};
        final AlertDialog.Builder builder=new AlertDialog.Builder(v.getContext());
        builder.setTitle("Elige una Opción");
        builder.setItems(opciones, (dialogInterface, i) -> {

            if (opciones[i].equals("Elegir de Galeria")){
                Intent intent=new Intent(Intent.ACTION_PICK,
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setType("image/");
                getActivity().startActivityForResult(intent.createChooser(intent,"Seleccione"),10);
            }else{
                dialogInterface.dismiss();
            }
        });
        builder.show();

         return v;
    }
}

如您所见,我正在从另一个片段加载一个片段,然后毫无问题地调用 startActivityResult。

希望对你有帮助。

【讨论】:

  • 我在 otrer 片段中进行交易,而不是在活动中。可能是这个问题吗?提前谢谢
  • 你的意思是从另一个片段启动片段吗?反正我会测试的哈哈
【解决方案4】:

异常表示您没有附加片段,否则附加的片段可能会被破坏,请重新附加片段。

【讨论】:

    猜你喜欢
    • 2019-09-04
    • 2018-05-18
    • 1970-01-01
    • 2017-02-23
    • 2019-01-13
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多