在使用Intent.ACTION_GET_CONTENT的startActivityForResult()之后没有调用onActivityResult()

时间:2015-01-29 19:00:22

标签: android android-intent android-fragments onactivityresult

我的主Activity拥有不同的Fragment,一个片段为用户提供了打开DialogFragment的可能性。该对话框打开声音文件列表,对话框还包含一个“添加”按钮,用户应该可以从中添加自己的声音文件。为此,我想使用标准的Android文件选择功能并使用Intent.ACTION_GET_CONTENT。因此,当用户按下“添加”按钮并且Android文件拣选功能按原样出现时,我会解除此意图,但是当我选择文件时,没有任何事情发生。我希望我的主要活动的onActivityResult()被触发,但它没有,我无法让它工作,我不明白为什么这不起作用。

public class MyDialog extends DialogFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Rest omitted...
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new AlertDialog.Builder(context)
            .setIcon(android.R.drawable.ic_dialog_info) 
            .setTitle(R.string.TONE_PROMPT_TITLE)       

            .setNeutralButton(R.string.ADD, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    intent.setType("audio/mpeg");
                    getActivity().startActivityForResult(intent, ADD_SOUND_REQUEST_CODE);
                }
            })

            .create();
}

}

我还试图通过以下方式实例化意图: Intent intent = new Intent(getActivity(), MyActivity.class); 但这也不起作用。

任何想法都会非常有用,谢谢!

3 个答案:

答案 0 :(得分:3)

管理以找出问题所在...... 在我的清单中,我已将Activity声明为android:noHistory="false",这就是问题所在。将我的活动设置为android:noHistory="true"并按照以下方式解雇Intent后,它就像魅力一样。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("audio/mpeg");           
getActivity().startActivityForResult(intent, ADD_SOUND_REQUEST_CODE);

就这样,我活动中的onActivityResult()被触发了,之后我跟着@ Rohit5k2关于如何触发我的Fragment的OnActivityResult()的建议工作真的很棒!

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    MyFragment fragmentObject = getSupportFragmentManager().findFragmentById(R.id.container);
    fragmentObject.onActivityResult(requestCode, resultCode, data);
}

谢谢你们的帮助!

答案 1 :(得分:2)

在包含片段的活动中执行此操作

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    MyFragment fragmentObject = getSupportFragmentManager().findFragmentById(R.id.container);
    fragmentObject.onActivityResult(requestCode, resultCode, data);
}

然后将调用片段中的onActivityResult()

答案 2 :(得分:0)

在片段中,您通常会使用this.startActivityForResult(...)并覆盖片段的方法onActivityResult(...)。由于您的案例是DialogFragment,因此在按下其中一个按钮后对话框将被销毁,这将无用。

这意味着您正确调用了getActivity().startActivityForResult(...),但由于调用者是活动,因此活动是必须实现onActivityResult(...)方法的活动。采用这种方法时,没有片段收到回调。