android - onActivityResult() को नए नेस्टेड खंड API में नहीं कहा जाता है




android-fragments android-nested-fragment (5)

मुख्य गतिविधि के लिए आप सुपर क्लास के साथ OnActivityForResult लिखते हैं जैसे

  @Override
public void onActivityResult(int requestCode, int resultCode, Intent result) {
    super.onActivityResult(requestCode, resultCode, result);
    if (requestCode == Crop.REQUEST_PICK && resultCode == RESULT_OK) {
        beginCrop(result.getData());
    } }

गतिविधि के लिए प्राप्त करें बिना एक्टिविटी () की तरह इरादा लिखें

 Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
        pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
       startActivityForResult(pickContactIntent, 103);

खंड के लिए AtActivityResult

   @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 101 && resultCode == getActivity().RESULT_OK && null != data) {

}}

मैं नए नेस्टेड खंड एपीआई का उपयोग कर रहा हूं जिसमें एंड्रॉइड समर्थन पुस्तकालय में शामिल है।

नेस्टेड टुकड़ों के साथ मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि, अगर एक घोंसला वाला टुकड़ा (यानी, एक टुकड़ा जिसे FragmentManager onActivityResult() के onActivityResult() द्वारा लौटाया गया है, तो एक टुकड़ा शुरू होता है। onActivityResult() , नेस्टेड टुकड़े की onActivityResult() विधि नहीं कहा जाता है हालांकि, दोनों माता-पिता खंड पर onActivityResult() और गतिविधि की onActivityResult() दोनों को कॉल किया जाता है।

मुझे नहीं पता कि मुझे घोंसले के टुकड़ों के बारे में कुछ याद आ रहा है, लेकिन मुझे वर्णित व्यवहार की उम्मीद नहीं थी। नीचे वह कोड है जो इस समस्या को पुन: उत्पन्न करता है। अगर कोई मुझे सही दिशा में इंगित कर सकता है और मुझे समझाता है कि मैं क्या गलत कर रहा हूं तो मैं बहुत सराहना करता हूं:

package com.example.nestedfragmentactivityresult;

import android.media.RingtoneManager;
import android.os.Bundle;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends FragmentActivity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.getSupportFragmentManager()
            .beginTransaction()
            .add(android.R.id.content, new ContainerFragment())
            .commit();
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);

        // This is called
        Toast.makeText(getApplication(),
            "Consumed by activity",
            Toast.LENGTH_SHORT).show();
    }

    public static class ContainerFragment extends Fragment
    {
        public final View onCreateView(LayoutInflater inflater,
                                       ViewGroup container,
                                       Bundle savedInstanceState)
        {
            View result = inflater.inflate(R.layout.test_nested_fragment_container,
                container,
                false);

            return result;
        }

        public void onActivityCreated(Bundle savedInstanceState)
        {
            super.onActivityCreated(savedInstanceState);
            getChildFragmentManager().beginTransaction()
                .add(R.id.content, new NestedFragment())
                .commit();
        }

        public void onActivityResult(int requestCode,
                                     int resultCode,
                                     Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);

            // This is called
            Toast.makeText(getActivity(),
                "Consumed by parent fragment",
                Toast.LENGTH_SHORT).show();
        }
    }

    public static class NestedFragment extends Fragment
    {
        public final View onCreateView(LayoutInflater inflater,
                                       ViewGroup container,
                                       Bundle savedInstanceState)
        {
            Button button = new Button(getActivity());
            button.setText("Click me!");
            button.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View v)
                {
                    Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
                    startActivityForResult(intent, 0);
                }
            });

            return button;
        }

        public void onActivityResult(int requestCode,
                                     int resultCode,
                                     Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);

            // This is NOT called
            Toast.makeText(getActivity(),
                "Consumed by nested fragment",
                Toast.LENGTH_SHORT).show();
        }
    }
}

test_nested_fragment_container.xml है:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</FrameLayout>

मुझे एक ही समस्या का सामना करना पड़ा! मैंने इसे ChildFragment में स्थिर ChildFragment का उपयोग करके हल किया, इस तरह:

private static ChildFragment mChildFragment;

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    mChildFragment.onActivityResult(int requestCode, int resultCode, Intent data);

}

मैंने इस समस्या को निम्नलिखित कोड के साथ हल किया (समर्थन पुस्तकालय का उपयोग किया जाता है):

इस तरह से एक्टिविटी रिसेट पर कंटेनर खंड ओवरराइड में:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        List<Fragment> fragments = getChildFragmentManager().getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                fragment.onActivityResult(requestCode, resultCode, data);
            }
        }
    }

अब नेस्टेड खंड को एक्टिविटी रिसेट विधि पर कॉल प्राप्त होगा।

इसके अलावा, जैसा noted एरिक ब्रेंसवॉल्ड ने इसी तरह के प्रश्न में noted , नेस्टेड टुकड़े को इसके मूल खंड का उपयोग करके गतिविधि शुरू करनी चाहिए, न कि सरल शुरुआत एक्टिविटीफॉर रिसेट () कॉल। तो, नेस्टेड टुकड़े में गतिविधि शुरू करें:

getParentFragment().startActivityForResult(intent, requestCode);

यह समस्या एंड्रॉइड सपोर्ट लाइब्रेरी 23.2 के बाद में तय की गई है । एंड्रॉइड सपोर्ट लाइब्रेरी 23.2+ में Fragment साथ हमें अब कुछ और करने की ज़रूरत नहीं है। onActivityResult() अब नेस्टेड Fragment में अपेक्षित के रूप में बुलाया जाता है।

मैंने अभी एंड्रॉइड सपोर्ट लाइब्रेरी 23.2.1 का उपयोग करके इसका परीक्षण किया है और यह काम करता है। अंत में मैं क्लीनर कोड हो सकता है!

तो, नवीनतम एंड्रॉइड सपोर्ट लाइब्रेरी का उपयोग करना शुरू करना है।


हां, नेस्टेड खंड में onActivityResult() इस तरह से नहीं लगाया जाएगा।

AtctivityResult (एंड्रॉइड समर्थन लाइब्रेरी में) का कॉलिंग अनुक्रम है

  1. Activity.dispatchActivityResult()
  2. FragmentActivity.onActivityResult()
  3. Fragment.onActivityResult()

तीसरे चरण में, FragmentMananger मूल Activity के FragmentMananger में पाया जाता है। तो आपके उदाहरण में, यह कंटेनर खंड है जो onActivityResult() पर प्रेषण के लिए पाया जाता है, नेस्टेड टुकड़ा कभी भी घटना प्राप्त नहीं कर सका।

मुझे लगता है कि आपको ContainerFragment.onActivityResult() में अपना खुद का प्रेषण लागू करना है, नेस्टेड टुकड़े को ढूंढें और परिणाम और डेटा को पास करने का आह्वान करें।







android-nested-fragment