gpt4 book ai didi

android - onActivityResult 未被调用,既不在 Activity 中也不在 Fragment 中

转载 作者:行者123 更新时间:2023-11-30 01:42:22 24 4
gpt4 key购买 nike

我对 onActivityResult 有疑问。已经有几个关于这个的话题,但是我看到的建议都没有对我有用。

我有以下 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!");
}
}

和 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;
}

}

}

当我点击 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();
}
}

显示日历 fragment :

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

}

当我单击列表中的项目时,日历将启动并按预期显示。选择日期后, Activity 将停止并返回到 EditDate Activity 。但是,无论我做什么,我都没有看到 onActivityResult 被调用。不在 EditDate Activity 中,也不在 EditDateFragment 中。我尝试了一些不同的方法,例如尝试 getActivity.startActivityForResult(intent,requestcode) 和使用 super.onActivityStarted(requestcode, resultCode,intent) 等等。没有任何效果。

理想情况下,我希望调用 Activity 中的 onActivityResult()。感谢您的帮助!

编辑:它现在可以工作了,我在 EditDateFragment 中有 static final int CHOOSEDAY = -1,在 EditDate 中有 CHOOSEDAY = 1。

最佳答案

只有当您使用 startActivityForResult() 开始一个新的 Activity 而不是 fragment 时才会调用此方法!!!我想这对你有帮助

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

关于android - onActivityResult 未被调用,既不在 Activity 中也不在 Fragment 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34300586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com