简体   繁体   中英

onActivityResult is not called, neither in Activity nor in Fragment

I have problem with onActivityResult. There are several threads about this already, but none of the suggestions I have seen have worked for me.

I have the following activity EditDate:

public class EditDate extends AppCompatActivity {
    EditDateFragment editDateFragment;
    JSONObject usrObject;
    int YEARPOSITION = -1;
    int MONTHPOSITION = -1;
    static final int CHOOSEDAY = 1;
    JSONArray resultsOld;
    JSONArray maxResultsOld;
    JSONArray disciplinesOld;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_date);
        usrObject = MainActivity.usrObject;
        Intent intent = getIntent();
        YEARPOSITION = intent.getIntExtra("YEARPOSITION",0);
        MONTHPOSITION = intent.getIntExtra("MONTHPOSITION",0);
        editDateFragment = new EditDateFragment();
        getSupportFragmentManager().beginTransaction().add(R.id.edit_date_container,editDateFragment).commit();

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        MainActivity.showToast("WTF!");
    }
    }

and a fragment EditDateFragment:

import android.content.Intent;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

/**
 * A placeholder fragment containing a simple view.
 */
public class EditDateFragment extends ListFragment {
    ListView mainListView;
    InteractiveArrayAdapter listAdapter;
    String LOG_TAG = getClass().getName();
    int YEARPOSITION = -1;
    int YEAR = -1;
    int MONTHPOSITION = -1;
    int MONTH = -1;
    private static final int CHOOSEDAY = -1;
    private float x1, x2;
    static final int MIN_DISTANCE = 150;
    GestureDetection gestureDetection;
    private JSONArray DAYS;

    @Override
    public void onActivityCreated(Bundle savedInstanceState){
        super.onActivityCreated(savedInstanceState);
        Intent intent = getActivity().getIntent();
        YEARPOSITION = intent.getIntExtra(MainActivity.YEARPOS, MainActivity.getStartYear());
        MONTHPOSITION = intent.getIntExtra(MainActivity.MONTHPOS, MainActivity.getStartMonth());
        gestureDetection = new GestureDetection();
        mainListView = getListView();
        mainListView.setOnTouchListener(gestureDetection);
        mainListView.setOnItemClickListener(listener);
        print();
    }
    public EditDateFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_edit_date, container, false);
        gestureDetection = new GestureDetection();
        ViewListener viewListener = new ViewListener();
        rootView.setOnTouchListener(viewListener);
        return rootView;
    }

    public void print() {
        try {
            ArrayList<Model> testResults = getResults();
            for (int i = 0; i < testResults.size(); i++) {
                System.out.println(testResults.get(i).getName());
            }
            mainListView = getListView();
            listAdapter = new InteractiveArrayAdapter(this.getActivity(), testResults);

            if (mainListView == null) {
            } else {
                mainListView.setAdapter(listAdapter);
            }
        } catch (JSONException e) {
            Log.e(LOG_TAG, e.getMessage(), e);
            e.printStackTrace();
        }
    }

    private ArrayList<Model> getResults() throws JSONException {

        ArrayList<Model> tmp = new ArrayList<Model>();

        try {

            JSONArray list = MainActivity.usrObject.getJSONArray(MainActivity.LIST);

            JSONObject yearObj = list.getJSONObject(YEARPOSITION);
            YEAR = yearObj.getInt(MainActivity.LIST_YEAR);
            String year = Integer.toString(yearObj.getInt(MainActivity.LIST_YEAR));
            JSONArray months = yearObj.getJSONArray(MainActivity.LIST_MONTHS);

            JSONObject monthObject = months.getJSONObject(MONTHPOSITION);
            MONTH = monthObject.getInt(MainActivity.MONTH);
            String month = Integer.toString(monthObject.getInt(MainActivity.MONTH));
            JSONArray days = monthObject.getJSONArray(MainActivity.LIST_DAYS);
            DAYS = days;
            for (int k = 0; k < days.length(); k++) {
                JSONObject dayObject = days.getJSONObject(k);
                String day = Integer.toString(dayObject.getInt(MainActivity.DAY));
                StringBuilder sb = new StringBuilder();
                sb.append(day + "/" + month + "  " + year);
                tmp.add(get(sb.toString()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //return tmp;

        return tmp;
    }

    private Model get(String s) {
        return new Model(s);
    }

    AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                                long arg3) {
            if (gestureDetection.swipeDetected()) {
                if (gestureDetection.getAction() == GestureDetection.Action.RL) {
                    int tmpMonthPos = MONTHPOSITION + 1;
                    try {
                        int maxMonth = getMaxMonth(YEARPOSITION);
                        if (tmpMonthPos > maxMonth) {
                            int tmpYearPos = YEARPOSITION + 1;
                            int maxYear = getMaxYear();
                            if (tmpYearPos <= maxYear) {
                                tmpMonthPos = 0;
                                startNewActivity(tmpYearPos,tmpMonthPos);
                            }
                        } else {
                            startNewActivity(YEARPOSITION,tmpMonthPos);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
                if (gestureDetection.getAction() == GestureDetection.Action.LR){

                    int tmpMonthPos = MONTHPOSITION -1;
                    if (tmpMonthPos < 0){
                        int tmpYearPos = YEARPOSITION - 1;
                        if ( tmpYearPos >= 0){
                            try {
                                int monthPos = getNewMonthPos(tmpYearPos);

                                startNewActivity(tmpYearPos,monthPos);

                            } catch (Exception e){
                                e.printStackTrace();
                            }
                        }
                    } else {
                        startNewActivity(YEARPOSITION, tmpMonthPos);
                    }
                }
            }
            else {


                startCalendar(position);


            }
        };
    };

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode,resultCode,data);
        System.out.println("HERE HERE");
        if (requestCode == CHOOSEDAY){
            if (resultCode == getActivity().RESULT_OK){
                Bundle bundle = data.getExtras();
                int day = bundle.getInt(MainActivity.DAY);
                int month = bundle.getInt(MainActivity.MONTH);
                int year = bundle.getInt(MainActivity.LIST_YEAR);
                MainActivity.showToast(day + " / " + month + " - " + year);
            }
        }
    }


    private void startCalendar(int position){
        MainActivity.showToast("HERE AT LEAST");
        Intent intent = new Intent(this.getContext(),showCalendar.class);
        intent.putExtra(MainActivity.YEARPOS,YEARPOSITION);
        intent.putExtra(MainActivity.MONTHPOS, MONTHPOSITION);
        startActivityForResult(intent, CHOOSEDAY);
    }


    private void startNewActivity(int yearposition, int monthposition) {
        Intent intent = new Intent(this.getActivity(), EditDate.class);
        intent.putExtra(MainActivity.YEARPOS, yearposition);
        intent.putExtra(MainActivity.MONTHPOS, monthposition);
        startActivity(intent);
    }

    private int getNewMonthPos(int yearPos) throws JSONException {
        JSONArray list = MainActivity.usrObject.getJSONArray(MainActivity.LIST);
        JSONObject yearObj = list.getJSONObject(yearPos);
        JSONArray tmpMonths = yearObj.getJSONArray(MainActivity.LIST_MONTHS);
        return tmpMonths.length() - 1;

    }

    private int getMaxYear() throws JSONException {
        JSONArray list = MainActivity.usrObject.getJSONArray(MainActivity.LIST);
        return list.length() - 1;
    }

    private int getMaxMonth(int yearPos) throws JSONException {
        JSONArray list = MainActivity.usrObject.getJSONArray(MainActivity.LIST);
        JSONObject yearObj = list.getJSONObject(yearPos);
        JSONArray months = yearObj.getJSONArray(MainActivity.LIST_MONTHS);
        return months.length() - 1;
    }

    public class ViewListener implements View.OnTouchListener {


        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    x1 = event.getX();
                    break;
                case MotionEvent.ACTION_UP:
                    x2 = event.getX();
                    float deltaX = x2 - x1;

                    if (Math.abs(deltaX) > MIN_DISTANCE) {
                        // Left to Right swipe action
                        if (x2 > x1) {

                            int tmpMonthPos = MONTHPOSITION -1;
                            if (tmpMonthPos < 0){
                                int tmpYearPos = YEARPOSITION - 1;
                                if ( tmpYearPos >= 0){
                                    try {
                                        int monthPos = getNewMonthPos(tmpYearPos);

                                        startNewActivity(tmpYearPos,monthPos);

                                    } catch (Exception e){
                                        e.printStackTrace();
                                    }
                                }
                            } else {
                                startNewActivity(YEARPOSITION, tmpMonthPos);
                            }
                        }

                        // Right to left swipe action
                        else {

                            int tmpMonthPos = MONTHPOSITION + 1;
                            try {
                                int maxMonth = getMaxMonth(YEARPOSITION);
                                if (tmpMonthPos > maxMonth) {
                                    int tmpYearPos = YEARPOSITION + 1;
                                    int maxYear = getMaxYear();
                                    if (tmpYearPos <= maxYear) {
                                        tmpMonthPos = 0;
                                        startNewActivity(tmpYearPos,tmpMonthPos);
                                    }
                                } else {
                                    startNewActivity(YEARPOSITION,tmpMonthPos);
                                }

                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    } else {

                    }
                    break;
            }
            return true;
        }

    }

}

When I click an item in the ListFragment, a calendar is shown, I start in the function startCalendar(int position)

The Activity and Fragment for showing the calendar are Activity:

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;

public class showCalendar extends AppCompatActivity {
    showCalendarFragment showCalendarFragment;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_calendar);
        showCalendarFragment = new showCalendarFragment();
        this.getSupportFragmentManager().beginTransaction().add(R.id.show_calendar_container,showCalendarFragment).commit();
    }
}

showCalendarFragment:

import android.content.Intent;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CalendarView;

/**
 * A placeholder fragment containing a simple view.
 */
public class showCalendarFragment extends Fragment implements CalendarView.OnDateChangeListener {

    private CalendarView calendarView;

    @Override
    public void onActivityCreated(Bundle savedInstanceState){
        super.onActivityCreated(savedInstanceState);
        Intent intent = getActivity().getIntent();

        calendarView = (CalendarView)getView().findViewById(R.id.calendarView);
        calendarView.setOnDateChangeListener(this);
    }
    public showCalendarFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_show_calendar, container, false);
    }

    @Override
    public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
        month = month  + 1;

        Intent intent = new Intent();
        Bundle bundle = new Bundle();
        bundle.putInt(MainActivity.LIST_YEAR,year);
        bundle.putInt(MainActivity.MONTH,month);
        bundle.putInt(MainActivity.DAY,dayOfMonth);
        intent.putExtras(bundle);
        getActivity().setResult(getActivity().RESULT_OK,intent);
        getActivity().finish();
    }

}

When I click an item in my list, the calendar is started and shown as it shall. When a date is chosen, the activity stops and goes back to the EditDate activity. However, no matter what I do, I do not see that onActivityResult is called. Not in the EditDate activity nor in the EditDateFragment. I have tried some different approaches like trying getActivity.startActivityForResult(intent,requestcode) and using super.onActivityStarted(requestcode, resultCode,intent) and so forth. Nothing has worked.

Ideally, I would like the onActivityResult() in the Activity to be called. Any help is appreciated!

Edit: It works now, I had static final int CHOOSEDAY = -1 in the EditDateFragment and CHOOSEDAY = 1 in EditDate.

this method is called only when you use startActivityForResult() to start a new activity not fragment!!! i think this will help you

Is there a method that works like start fragment for result?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM