onActivityResult не вызывается ни в Activity, ни во Fragment

У меня проблема с onActivityResult. Об этом уже было несколько тем, но ни одно из предложений, которые я видел, не сработало для меня.

У меня есть следующая активность 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!");
    }
    }

и фрагмент 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;
        }

    }

}

Когда я нажимаю элемент в ListFragment, отображается календарь, я запускаю функцию startCalendar(int position)

Activity и Fragment для отображения календаря — это 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();
    }
}

показатьКалендарФрагмент:

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();
    }

}

Когда я щелкаю элемент в своем списке, календарь запускается и отображается так, как должен. При выборе даты действие останавливается и возвращается к действию EditDate. Однако, что бы я ни делал, я не вижу, что вызывается onActivityResult. Ни в действии EditDate, ни в EditDateFragment. Я пробовал несколько разных подходов, таких как попытка getActivity.startActivityForResult(intent,requestcode) и использование super.onActivityStarted(requestcode, resultCode,intent) и так далее. Ничего не сработало.

В идеале я хотел бы, чтобы onActivityResult() в Activity вызывался. Любая помощь приветствуется!

Изменить: теперь это работает, у меня был static final int CHOOSEDAY = -1 в EditDateFragment и CHOOSEDAY = 1 в EditDate.


person El_Loco    schedule 15.12.2015    source источник


Ответы (1)


этот метод вызывается только тогда, когда вы используете startActivityForResult() для запуска нового действия, а не фрагмента!!! я думаю это тебе поможет

Есть ли метод, который работает как начальный фрагмент для результат?

person hamidrezabstn    schedule 15.12.2015
comment
showCalendar — это действие, которое запускается из фрагмента. Я видел много постов, в которых утверждалось, что вы можете запустить действие для получения результата во фрагменте. - person El_Loco; 16.12.2015
comment
showCalendar — это действие, showCalendarFragment — это фрагмент. Я не понимаю, что вы имеете в виду. - person El_Loco; 18.12.2015