onActivityResult nie jest wywoływany we fragmencie
Aktywność przechowująca ten fragment ma swój onActivityResult
wywoływany, gdy aktywność kamery powraca.
Mój fragment rozpoczyna działanie na wynik z zamiarem wysłania kamery do zrobienia zdjęcia. Aplikacja picture ładuje się dobrze, robi zdjęcie i powraca. onActivityResult
jednak nigdy nie został trafiony. Ustawiłem punkty przerwania, ale nic nie jest wyzwalane. Czy fragment może mieć onActivityResult
? Myślę, że tak, ponieważ jest to funkcja zapewniona. Dlaczego to się nie uruchamia?
ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1888);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if( requestCode == 1888 ) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
}
}
30 answers
Aktywność hostingu nadpisuje onActivityResult()
, ale nie wykonała połączenia do super.onActivityResult()
dla nieobsługiwanych kodów wyników. Najwyraźniej, mimo że fragment jest Tym, który wykonuje startActivityForResult()
wywołanie, aktywność dostaje pierwszą szansę na obsługę wyniku. Ma to sens, jeśli weźmiemy pod uwagę modułowość fragmentów. Kiedy zaimplementowałem super.onActivityResult()
dla wszystkich nieobsługiwanych wyników, fragment dostał szansę na obsługę wyniku.
A także od @siqing ODPOWIEDŹ:
Aby uzyskać wynik w swoim fragmencie upewnij się wywołujesz startActivityForResult(intent,111);
zamiast getActivity().startActivityForResult(intent,111);
wewnątrz swojego fragmentu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 11:48:55
Chyba zadzwoniłeś. Powinieneś zadzwonić startActivityForResult(intent,111);
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-26 08:38:06
Opcja 1:
Jeśli wywołujesz startActivityForResult()
z fragmentu, powinieneś wywołać startActivityForResult()
, a nie getActivity().startActivityForResult()
, ponieważ spowoduje to fragment onActivityResult ().
Jeśli nie jesteś pewien, gdzie wywołujesz startActivityForResult()
i jak będziesz wywoływał metody.
Opcja 2:
Ponieważ aktywność otrzymuje wynik onActivityResult()
, musisz nadpisać aktywność onActivityResult()
i wywołać super.onActivityResult()
, aby propagować do odpowiedniego fragmentu dla nieobsługiwanych kodów wyników albo dla wszystkich.
Jeśli powyższe dwie opcje nie działają, zapoznaj się z opcją 3, ponieważ na pewno zadziała.
Opcja 3:
Jawne wywołanie z fragmentu do funkcji onActivityResult jest następujące.
W macierzystej klasie Activity, nadpisuje metodę onActivityResult (), a nawet nadpisuje tę samą w klasie Fragment i wywołuje jak poniższy kod.
W klasie nadrzędnej:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
fragment.onActivityResult(requestCode, resultCode, data);
}
W klasie dziecięcej:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// In fragment class callback
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-27 14:27:21
Mam ten sam problem z ChildFragmentManager
. Menedżer nie przekaże wyniku do zagnieżdżonego fragmentu, musisz to zrobić ręcznie w swoim fragmencie bazowym.
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
Fragment fragment = (Fragment) getChildFragmentManager().findFragmentByTag(childTag);
if (fragment != null) {
fragment.onActivityResult(requestCode, resultCode, intent);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 10:11:34
W przypadku, gdy nie znasz fragmentów w swojej aktywności po prostu wylicz je wszystkie i wyślij argumenty wyniku aktywności:
// In your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-18 21:37:43
FragmentActivity
zastępuje requestCode
przez zmodyfikowaną. Następnie, gdy zostanie wywołane onActivityResult()
, FragmentActivity
parsuje wyższe 16 bitów i przywraca indeks oryginalnego fragmentu. Spójrz na ten schemat:
Jeśli masz kilka fragmentów na poziomie głównym, nie ma żadnych problemów. Ale jeśli masz zagnieżdżone fragmenty , na przykład {[4] } z kilkoma zakładkami wewnątrz ViewPager
, gwarantowane napotkasz problem (lub już napotkasz it).
Ponieważ tylko jeden indeks jest przechowywany w requestCode
. To jest indeks Fragment
wewnątrz jego FragmentManager
. Gdy używamy zagnieżdżonych fragmentów, są potomkije FragmentManager
s, które mają własną listę fragmentów. Dlatego konieczne jest zapisanie całego łańcucha indeksów, począwszy od korzenia FragmentManager
.
Jak rozwiązać ten problem?{[22] } istnieje wspólne rozwiązanie obejścia w tym poście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:17:46
To jedna z najpopularniejszych kwestii. Możemy znaleźć wiele wątków dotyczących tego problemu. Ale żaden z nich nie jest dla mnie przydatny.
Więc rozwiązałem ten problem używając tego rozwiązania.
Najpierw zrozummy, dlaczego tak się dzieje.
możemy wywołać startActivityForResult
bezpośrednio z fragmentu, ale w rzeczywistości wszystkie mechaniki są obsługiwane przez aktywność.
Gdy zadzwonisz startActivityForResult
z fragmentu, requestCode zostanie zmieniony na attached / Align = "left" / Dzięki temu Activity będzie w stanie wyśledzić tego, kto wyśle to żądanie po otrzymaniu wyniku.
Po przywróceniu aktywności wynik zostanie wysłany do onActivityResult aktywności ze zmodyfikowanym requestCode, który zostanie zdekodowany do oryginalnej tożsamości requestCode + Fragment. Następnie Activity wyśle wynik działania do tego fragmentu za pośrednictwem onActivityResult. I już po wszystkim.
Problem jest:
Aktywność może wysłać wynik tylko do fragmentu, który został dołączony bezpośrednio do aktywności, ale nie do zagnieżdżonego. To jest powód, dla którego onActivityResult zagnieżdżonego fragmentu nigdy nie zostałby wywołany bez względu na wszystko.
Rozwiązanie:
1) Rozpocznij intencję w swoim fragmencie według poniższego kodu:
/** Pass your fragment reference **/
frag.startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE = 12345
2) teraz w nadpisaniu aktywności rodzica**onActivityResult()
:**
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
Musisz wywołać to w aktywności rodzica, aby to zrobić praca.
3) w Twoim wywołaniu fragmentu:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
}
}
To wszystko.
Dzięki temu rozwiązaniu można go zastosować dla dowolnego pojedynczego fragmentu, niezależnie od tego, czy jest zagnieżdżony, czy nie. I tak, obejmuje również całą sprawę! Co więcej, kody są również ładne i czyste.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 09:12:57
Dla wielu zagnieżdżonych fragmentów (na przykład przy użyciu Viewpagera we fragmencie)
W głównej aktywności :
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
W Twoim fragmencie:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
for (Fragment fragment : getChildFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
W zagnieżdżonym fragmencie
Aktywność wywołania
getParentFragment().startActivityForResult(intent, uniqueInstanceInt);
uniqueInstanceInt - zastąp go int, który jest unikalny wśród zagnieżdżonych fragmentów, aby zapobiec traktowaniu odpowiedzi przez inny fragment.
Odbierz odpowiedź
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == uniqueInstanceInt ) {
// TODO your code
}
}
Uwaga
Liczba pomiędzy 0 a 65536 muszą być używane w uniqueInstanceInt do unikania błędu "może używać tylko niższych 16 bitów dla requestCode".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:37:35
Mogę dodać dwie rady, jeśli ktoś nadal nie może. W Oczywisty Sposób.plik xml, upewnij się, że aktywność hostingu nie zakończyła się po oddzwanianiu, a aktywność, która ma zostać uruchomiona, ma standardowo tryb uruchamiania. Zobacz szczegóły jak poniżej:
Dla aktywności hostingowej, ustaw właściwość no history jako false, jeśli masz
android:noHistory="false"
Aby rozpocząć aktywność, ustaw tryb uruchamiania jako standardowy, jeśli masz
android:launchMode="standard"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-30 03:36:06
Spotkałem się również z tym problemem we fragmencie. I zadzwoniłem startActivityForResult
w DialogFragment
.
ale teraz ten problem został rozwiązany: FragmentClassname.this.startActivityForResult
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:30:54
Miałem również ten sam problem, gdy przeniosłem ten blok kodu poza Fragment do klasy użytkowej , z parentActivity
przekazanym jako argument ,
Intent intent = new Intent(parentActivity, CameraCaptureActivity.class);
parentActivity.startActivityForResult(intent,requestCode);
Wtedy nie otrzymałem żadnej wartości w onActivityResult
metodzie tego fragmentu ,
Następnie zmieniłem argument na Fragment , więc zmieniona definicja metody wyglądała następująco:
Intent intent = new Intent(fragment.getContext(), CameraCaptureActivity.class);
fragment.startActivityForResult(intent,requestCode);
Potem udało mi się uzyskać wartość w {[3] } na fragmencie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-07 07:05:48
Rozwiązanie 1:
Wywołaj startActivityForResult(intent, REQUEST_CODE);
zamiast getActivity().startActivityForResult(intent, REQUEST_CODE);
.
Rozwiązanie 2:
Kiedy startActivityForResult(intent, REQUEST_CODE);
jest wywoływana aktywność onActivityResult(requestCode,resultcode,intent)
, a następnie można wywołać fragments onActivityResult()
stąd, przechodząc requestCode, resultCode and intent
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:26:49
Wewnątrz twojego fragmentu, zadzwoń
this.startActivityForResult(intent, REQUEST_CODE);
Gdzie this
odnosi się do fragmentu. W przeciwnym razie zrób tak, jak powiedział @ Clevester:
Fragment fragment = this;
....
fragment.startActivityForResult(intent, REQUEST_CODE);
I had to call
super.onActivityResult(requestCode, resultCode, data);
W aktywności rodzica onActivityResult
, Aby to działało.
(dostosowałem tę odpowiedź z odpowiedzi @ Clevester.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:29:09
W moim przypadku był to błąd Androida (http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/), Jeśli używasz wspieranego {[1] } musisz użyć getSupportFragmentManager
zamiast getChildFragmentManager
:
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if(fragment instanceof UserProfileFragment) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 10:11:23
W skrócie,
We fragmencie, declare Fragment fragment = this
;
Po tym użyciu fragment.startActivityForResult
.
Wynik powróci w activiresult.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-18 07:45:42
Dla zagnieżdżonych fragmentów (na przykład przy użyciu Viewpagera)
W Twojej głównej aktywności:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
W głównym fragmencie najwyższego poziomu (fragment Viewpagera):
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
frag.yourMethod(data); // Method for callback in YourFragment
super.onActivityResult(requestCode, resultCode, data);
}
In YourFragment (zagnieżdżony fragment):
public void yourMethod(Intent data){
// Do whatever you want with your data
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:35:17
public class takeimage extends Fragment {
private Uri mImageCaptureUri;
private static final int PICK_FROM_CAMERA = 1;
private static final int PICK_FROM_FILE = 2;
private String mPath;
private ImageView mImageView;
Bitmap bitmap = null;
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.activity_send_image, container, false);
final String[] items = new String[] { "From Camera", "From SD Card" };
mImageView = (ImageView)view.findViewById(R.id.iv_pic);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.select_dialog_item, items);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Select Image");
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (item == 0) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory(), "tmp_avatar_"
+ String.valueOf(System.currentTimeMillis())
+ ".jpg");
mImageCaptureUri = Uri.fromFile(file);
try {
intent.putExtra(
android.provider.MediaStore.EXTRA_OUTPUT,
mImageCaptureUri);
intent.putExtra("return-data", true);
getActivity().startActivityForResult(intent,
PICK_FROM_CAMERA);
} catch (Exception e) {
e.printStackTrace();
}
dialog.cancel();
} else {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
getActivity().startActivityForResult(
Intent.createChooser(intent,
"Complete action using"), PICK_FROM_FILE);
}
}
});
final AlertDialog dialog = builder.create();
Button show = (Button) view.findViewById(R.id.btn_choose);
show.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Switch the tab content to display the list view.
dialog.show();
}
});
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK)
return;
if (requestCode == PICK_FROM_FILE) {
mImageCaptureUri = data.getData();
// mPath = getRealPathFromURI(mImageCaptureUri); //from Gallery
if (mPath == null)
mPath = mImageCaptureUri.getPath(); // from File Manager
if (mPath != null)
bitmap = BitmapFactory.decodeFile(mPath);
} else {
mPath = mImageCaptureUri.getPath();
bitmap = BitmapFactory.decodeFile(mPath);
}
mImageView.setImageBitmap(bitmap);
}
public String getRealPathFromURI(Uri contentUri) {
String [] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(contentUri, proj, null, null,null);
if (cursor == null) return null;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-18 23:35:04
Możesz po prostu nadpisać BaseActivity
onActivityResult
na fragmenciebaseActivity.startActivityForResult
.-
Na BaseActivity dodać interfejs i nadpisać onActivityResult.
private OnBaseActivityResult baseActivityResult; public static final int BASE_RESULT_RCODE = 111; public interface OnBaseActivityResult{ void onBaseActivityResult(int requestCode, int resultCode, Intent data); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(getBaseActivityResult() !=null && requestCode == BASE_RESULT_RCODE){ getBaseActivityResult().onBaseActivityResult(requestCode, resultCode, data); setBaseActivityResult(null); }
-
On Fragment implements
OnBaseActivityResult
@Override public void onBaseActivityResult(int requestCode, int resultCode, Intent data) { Log.d("RQ","OnBaseActivityResult"); if (data != null) { Log.d("RQ","OnBaseActivityResult + Data"); Bundle arguments = data.getExtras(); } }
To obejście wystarczy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-31 14:32:59
Jeśli powyższy problem pojawia się na Facebook login , możesz użyć poniższego kodu w aktywności rodzica twojego fragmentu, np.:]}
Fragment fragment = getFragmentManager().findFragmentById(android.R.id.tabcontent);
fragment.onActivityResult(requestCode, resultCode, data);
Lub:
Fragment fragment = getFragmentManager().findFragmentById("fragment id here");
fragment.onActivityResult(requestCode, resultCode, data);
I dodaj poniższe wywołanie w swoim fragmencie...
callbackManager.onActivityResult(requestCode, resultCode, data);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:33:55
Większość z tych odpowiedzi ciągle mówi, że musisz zadzwonić super.onActivityResult(...)
do swojego hosta Activity
dla swojego Fragment
. Ale to chyba nie działa.
Więc w Twoim hostingu Activity
powinieneś zadzwonić do swojego Fragments
onActivityResult(...)
zamiast tego. Oto przykład.
public class HostActivity extends Activity {
private MyFragment myFragment;
protected void onActivityResult(...) {
super.onActivityResult(...);
this.myFragment.onActivityResult(...);
}
}
W pewnym momencie w HostActivity
będziesz musiał przypisać this.myFragment
Fragment
, którego używasz. Możesz też użyć FragmentManager
, aby uzyskać Fragment
zamiast trzymać odniesienie do niego w swoim HostActivity
. Sprawdź też null
zanim spróbujesz wywołać this.myFragment.onActivityResult(...);
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-08 15:04:40
Jak wspomniał Ollie C, istnieje aktywny błąd dla biblioteki wsparcia używającej zwracanych wartości do onActivityResult, gdy używasz zagnieżdżonych fragmentów. Właśnie trafiłem: - (.
Zobacz Fragment.onActivityResult nie jest wywoływany, gdy requestCode != 0.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:12:49
Mam silne podejrzenie, że wszystkie odpowiedzi tutaj są niczym więcej niż hacki. Próbowałem ich wszystkich i wielu innych, ale bez żadnych wiarygodnych wniosków, ponieważ zawsze jest jakiś głupi problem. Nie mogę polegać na niespójnych wynikach. Jeśli spojrzysz na oficjalną dokumentację API Androida dla fragmentów, zobaczysz, że Google wyraźnie stwierdza, co następuje:
Wywołaj startActivityForResult (Intent, int) z aktywności zawierającej fragment.
Zobacz: Android Fragment API
Wydaje się więc, że najbardziej poprawnym i niezawodnym podejściem byłoby wywołanie startActivityForResult () {[12] } z działania hostingu, a także obsługa wynikowego onActivityResult() stamtąd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:23:35
Twój kod ma zagnieżdżony fragment. Dzwonię do super.onActivityForResult nie działa
Nie chcesz modyfikować każdej aktywności, z której można wywołać Twój fragment, ani wykonywać pracy wokół wywołania każdego fragmentu w łańcuchu fragmentów.
Oto jedno z wielu działających rozwiązań. Utwórz fragment w locie i podłącz go bezpośrednio do aktywności za pomocą Menedżera fragmentów wsparcia. Następnie wywołaj startActivityForResult z nowo utworzonego fragmentu.
private void get_UserEmail() {
if (view == null) {
return;
}
((TextView) view.findViewById(R.id.tvApplicationUserName))
.setText("Searching device for user accounts...");
final FragmentManager fragManager = getActivity().getSupportFragmentManager();
Fragment f = new Fragment() {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
startActivityForResult(AccountPicker.newChooseAccountIntent(null, null,
new String[]{"com.google"}, false, null, null, null, null), REQUEST_CODE_PICK_ACCOUNT);
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
String mEmail = "";
if (resultCode == Activity.RESULT_OK) {
if (data.hasExtra(AccountManager.KEY_ACCOUNT_NAME)) {
mEmail = data
.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
}
}
if (mActivity != null) {
GoPreferences.putString(mActivity, SettingApplication.USER_EMAIL, mEmail);
}
doUser();
}
super.onActivityResult(requestCode, resultCode, data);
fragManager.beginTransaction().remove(this).commit();
}
};
FragmentTransaction fragmentTransaction = fragManager
.beginTransaction();
fragmentTransaction.add(f, "xx" + REQUEST_CODE_PICK_ACCOUNT);
fragmentTransaction.commit();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 13:16:33
Mój Problem był z aktywnością hosta znalazłem go z zestawem android:launchMode="standard"
usunąłem go tymczasowo i działa !
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-23 02:13:00
Jednym z najprostszych sposobów jest rozpoczęcie aktywności od swojego fragmentu.
startActivity(ActivityName);
Następnie dodaj wywołanie startActivityForResult(intent,"1");
ze swojej aktywności i dodaj onActivityResult
do swojej aktywności
startActivityForResult(intent,"1");
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
fragment.onActivityResult(requestCode, resultCode, data);
// perform other activity result like fetching from Uris or handling cursors
finish(); // finish the activity will get to back to your fragment.
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-30 09:21:15
Robię tylko metodę obejścia:
public static Fragment _tempFragment = null;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(_tempFragment != null)
_tempFragment.onActivityResult(requestCode, resultCode, data);
}
W Twoim fragmencie, przed uruchomieniem, ustaw
MainActivity._tempFragment = this;
Po onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Do your job
{
}
MainActivity._tempFragment = null;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:11:16
Wystarczy użyć poniższego kodu dla fragmentu.
@Override
public void onOtherButtonClick(ActionSheet actionSheet, int index) {
if (index == 1)
{
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), 1);
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 1) {
if (requestCode == 1) {
Uri selectedImageUri = data.getData();
//selectedImagePath = getPath(selectedImageUri);
}
}
}
OnActivityResult zadzwoni bez wywoływania swojego rodzica.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 17:32:35
Jeden punkt, którego nikt nie ma
mention
, aby upewnić się, że aktywność hosta w trybie uruchamiania nie może być ustawiona nasingleInstance
lubsingleTask
.
OnActivityResult nie będzie działać, jeśli twój tryb uruchamiania jest ustawiony na SingleInstance lub SingleTask. lub wywołujesz swoją aktywność za pomocą tych filtrów IntentFilters
standard
lub singleTop
tryb uruchamiania będzie działał poprawnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-10 09:12:04
Jeśli występują problemy z metodą onActivityResult
, która znajduje się wewnątrz klasy fragment, i chcesz zaktualizować coś, co jest również wewnątrz klasy fragment, użyj:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == Activity.RESULT_OK)
{
// If the user had agreed to enabling Bluetooth,
// populate the ListView with all the paired devices.
this.arrayDevice = new ArrayAdapter<String>(this.getContext(), R.layout.device_item);
for(BluetoothDevice bd : this.btService.btAdapater.getBondedDevices())
{
this.arrayDevice.add(bd.getAddress());
this.btDeviceList.setAdapter(this.arrayDevice);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
Wystarczy dodać {[2] } Jak pokazano w powyższym kodzie. W przeciwnym razie metoda zostanie wywołana w aktywności nadrzędnej i zmienna nie będzie aktualizowana bieżącej instancji.
Przetestowałem go również umieszczając ten blok kodu w MainActivity
, zastępując this
klasą HomeFragment
i mając zmienne statyczne. I mam wyniki, jak się spodziewałem.
Więc jeśli chcesz, aby Klasa fragment miała własną implementację onActivityResult
, powyższy przykład kodu jest odpowiedzią.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 10:10:22
Jeśli używasz zagnieżdżonych fragmentów, działa to również:
getParentFragment().startActivityForResult(intent, RequestCode);
Oprócz tego, musisz wywołać super.onActivityResult
z aktywności rodzica i wypełnić metodę onActivityResult
fragmentu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 10:11:08