Search code examples
javaandroidlistviewandroid-contextonactivityresult

How to get context inside onActivityResult?


I have a DialogFragment which gives an option to pick a file using startActivityForResult. I then use onActivityResult to recieve the data and request code. After the file is chosen using the filemanager I access it from onActivityResult. Not doing much with the actual file being chosen right now as the main problem is when the file comes in I can get its name, other stuff. Now I add this into a HashMap<String, Object> which is then added to ArrayList<HashMap<String, Object>>. I then want to use a SimpleAdapter with a custom xml layout to populate the listview. The problem is SimpleAdapter requires the context as a parameter. How can I recieve the context in onActivityResult()?

Some Code to get a better picture of what I am doing:

    public class MyFragment extends DialogFragment {
    ...
    ...
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    ...
    //here I want to get the context
    SimpleAdapter simpleAdapter = new SimpleAdapter(thecontext, attachments_list, R.layout.mycustomlayout, keys, ids);
    ...
    }
    }

UPDATE:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SimpleAdapter.notifyDataSetChanged()' on a null object reference

UPDATE FULL CODE:

public class MyFragment extends DialogFragment {

    //code for whole activity
    public static final String NEW_NOTE_CARD_FRAGMENT_CODE = "1";

    //codes for each menu button
    public static final String PICK_FILE_REQ_CODE = "2";
    public static final String PICK_NEW_IMAGE_CODE = "3";


    //attachment keys
    public static final String KEY_ATTACHMENT_NAME = "a_name";
    public static final String KEY_ATTACHMENT_DATE_ADDED = "a_date_added";
    public static final String KEY_ATTACHMENT_ICON = "a_icon";

    ArrayList<HashMap<String, Object>> attachmentsListArray = new ArrayList<HashMap<String, Object>>();

    //listview
    ListView attachmentsListView;

    SimpleAdapter simpleAdapter;



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.newnotecard, container, false);

        //dialog customizations
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        // set color transparent
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));


        final ImageButton addNewAttachment = (ImageButton) v.findViewById(R.id.addNewAttachment);



        //addNewAttachment
        addNewAttachment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //this adds the an xml layout to a linearlayout which is the layout of this dialog
                //new attachment window
                LayoutInflater thismenulayoutinflater = (LayoutInflater) getActivity().getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View newnoteattachment_window = thismenulayoutinflater.inflate(R.layout.newnotenewattachment, newnotewindowextras, false);
                newnotewindowextras.addView(newnoteattachment_window);

                //listview for attachment files
                attachmentsListView = (ListView) newnoteattachment_window.findViewById(R.id.attachmentsListView);

                String attachmentName = "My test file ";
                String attachmentDateAdded = "Added: Nov ";

                //create random data
                for (int i = 0; i < 3; i++) {
                    HashMap<String, Object> singleAttachment = new HashMap<String, Object>();

                    singleAttachment.put(KEY_ATTACHMENT_NAME, attachmentName + i);
                    singleAttachment.put(KEY_ATTACHMENT_DATE_ADDED, attachmentDateAdded + (i + 1));

                    attachmentsListArray.add(singleAttachment);
                }


                String[] keys = {KEY_ATTACHMENT_NAME, KEY_ATTACHMENT_DATE_ADDED};
                int[] ids = {R.id.attachment_name, R.id.attachment_date_added};

                simpleAdapter = new SimpleAdapter(getActivity().getApplicationContext(), attachmentsListArray, R.layout.individualattachmentlayout, keys, ids);
                attachmentsListView.setAdapter(simpleAdapter);




                //the actual action for this button
                Intent openFileExplorerIntent = new Intent(Intent.ACTION_GET_CONTENT);
                openFileExplorerIntent.setType("*/*");
                getActivity().startActivityForResult(openFileExplorerIntent, Integer.parseInt(NEW_NOTE_CARD_FRAGMENT_CODE + PICK_FILE_REQ_CODE));
            }
        });

        return v;
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        int reqCode_l = Character.getNumericValue(Integer.toString(requestCode).charAt(1));


        if (reqCode_l == Integer.parseInt(PICK_FILE_REQ_CODE)) {//do file pick stuff
            //new individual file window
            Log.i("MENU ACTION", "FILE PICK: " + data.getData());

            String attachmentName = "Title ";
            String attachmentDateAdded = "Edited: Nov ";

            for (int i = 0; i < 6; i++) {
                HashMap<String, Object> singleAttachment = new HashMap<String, Object>();

                singleAttachment.put(KEY_ATTACHMENT_NAME, attachmentName + (i+1));
                singleAttachment.put(KEY_ATTACHMENT_DATE_ADDED, attachmentDateAdded + (i + 1));
                //singleAttachment.put(KEY_ATTACHMENT_ICON, tmp_attachmentIcon);

                attachmentsListArray.add(singleAttachment);
            }

            simpleAdapter.notifyDataSetChanged();
        }


    }
}

The big problem I am seeing here is after the startActivityOnResult finishes and we come back into our activity to the dialog, the variables are set to null, the ones I initialize onbutton click.

NEW UPDATE

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        Log.i("LIFECYCLE", "onCreate");
    }

@Override
    public void onDestroyView() {

        Log.i("LIFECYCLE", "Fragment onDestroyView");

        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    }

Also when the startActivtiyForResult is called the onPause() and onStop() but onDestroyView() is never called.

It still doesn't work.

FINAL UPDATE

I would like to apologize to for the height of stupidity that I was making. In my hosting Activity which is MainActivity.java, when this Activity would call onActivityResult() I would create a new instance of the dialog fragment as such: new MyDialogFragment().onActivityResult() and obviously this is why none of your guys methods worked as onCreateView wasn't called this time. I have change new MyDialogFragment() to the previously initialized dialog fragment that I am actually displaying and everything works now. And I will close this question.


Solution

  • UPDATE

    If the DialogFragment is not added to the back stack, then you can try using setRetainInstance (boolean retain) when you first create it.

    ORIGINAL ANSWER

    I think you need to modify your program flow a little.

    Simply put, you should set up your ListView, the ArrayList for the data, and the Adapter in onActivityCreated.

    This way, before your user can go pick a file from your DialogFragment, you will have your ListView and its Adapter ready to receive new data.

    Then in the onActivityResult block, just add the data to the ArrayList and call notifyDatasetChanged on your Adapter.