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);
    }
}
Author: Peter Mortensen, 2011-05-27

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.

 1063
Author: Spidy,
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);.

 303
Author: siqing,
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
}
 194
Author: Vinayak,
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);
    }
}
 70
Author: MinceMan,
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);
    }
}
 65
Author: ruX,
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

Oryginalny post.

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:

Tutaj wpisz opis obrazka

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.

Tutaj wpisz opis obrazka

Jak rozwiązać ten problem?{[22] } istnieje wspólne rozwiązanie obejścia w tym poście.

GitHub: https://github.com/shamanland/nested-fragment-issue

 53
Author: Oleksii K.,
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.
 38
Author: KishuDroid,
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".

 15
Author: Luciano Marqueto,
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"
 12
Author: jowett,
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.

 9
Author: Courysky,
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

 6
Author: Shamsul Arefin Sajib,
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.

 5
Author: Amey Haldankar,
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.)

 4
Author: Suragch,
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);
        }
    }
}
 4
Author: Hazlo8,
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.

 3
Author: 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
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
}
 3
Author: Jyotman Singh,
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);
    }
} 
 2
Author: shakirullah orakzai,
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
  1. Możesz po prostu nadpisać BaseActivity onActivityResult na fragmencie baseActivity.startActivityForResult.

  2. 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);
    }
    
  3. 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.

 2
Author: Khaled Lela,
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);
 2
Author: Ketan Patel,
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(...);.

 1
Author: prolink007,
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.

 1
Author: chaqke,
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.

 1
Author: Chris,
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();
}
 1
Author: danny117,
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 !

 1
Author: Abdellah,
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.
}
 0
Author: Rohit Goyal,
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;
}
 0
Author: Ah Lam,
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.

 0
Author: Kirtikumar 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-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 na singleInstance lub singleTask.

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.

 0
Author: Xar E Ahmer,
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ą.

 0
Author: Evgeny Danilenko,
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.

 0
Author: Oguz Ozcan,
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