SORU
27 Kasım 2012, Salı


() onActivityResult yeni iç içe fragment API " değil,"

Android destek kütüphanede içeren nested fragment yeni API kullanıyorum.

Sorun şu ben bakacak şekilde iç içe geçmiş parçaları olduğunu, Eğer bir iç içe geçmiş bir parça (bir parça, bu atılmış bir parça) FragmentManageriade getChildFragmentManager()) çağrı startActivityForResult(), iç içe parçası onActivityResult() yöntem çağrılmaz. Ancak, üst parçası onActivityResult() ve etkinliği onActivityResult() hem aradı.

Eğer iç içe geçmiş parçaları hakkında ben bir şey eksik bilmiyorum, ama açıklanan davranış beklemiyordum. Aşağıda, bu sorun oluşmazsa kodu. Çok fazla eğer birisi doğru yönde bana gelin ve ben yanlış yapıyorum bana ne söyleyebilir sevinirim:

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>

CEVAP
12 Aralık 2013, PERŞEMBE


Aşağıdaki kodu (destek Kütüphanesi kullanılır) ile bu sorunu çözdüm:

Kap parçası bu şekilde onActivityResult geçersiz kılma:

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

Şimdi iç içe parçası yöntem onActivityResult için çağrı alır.

Ayrıca, benzer soru 15* Eric Brynsvold *gibi, iç içe geçmiş parça aktivite üst parça ve basit startActivityForResult kullanarak başlamalıdır() arayın. Yani, parçanın başlangıç aktivite ile iç içe

getParentFragment().startActivityForResult(intent, requestCode);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Julia Graf

    Julia Graf

    6 Mayıs 2006
  • KoreanFrogMania님의 채널

    KoreanFrogMa

    18 Aralık 2011
  • Roger Huffman

    Roger Huffma

    4 ŞUBAT 2007