6

Wählen Sie Bild aus der Galerie innerhalb der Fragment-Klasse funktioniert nicht.Bild aus der Galerie auswählen funktioniert nicht in Fragment-Klasse in Android

Ich versuchte mehr Stacks Code.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY_INTENT_CALLED); 
} else { 
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.setType("image/*"); 
    startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED); 
} 

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

Der obige Code funktioniert in der Aktivitätsklasse. Nicht für reine Fragmentklasse.

+0

Bitte erklären, was "nicht funktioniert" bedeutet. – CommonsWare

+1

Ich habe dieses Problem konfrontiert, als ich es mit verschachtelten Fragmenten versuchte. – Krish

+0

Hi Commonsware, Bild aus der Galerie auswählen funktioniert nicht in Fragment-Klasse – harikrishnan

Antwort

0

Wenn Ihr sind die startActivityForResult() Methode von einem Fragment Aufruf, haben Sie zwei Möglichkeiten:

  1. Anruf startActivityForResult() direkt
  2. Anruf getActivity().startActivityForResult()

In Ihrem Fall, wenn Sie wollen Behandeln Sie das Ergebnis auf Ihrem Activity, ändern Sie Ihren Code auf diese Weise:

Andernfalls, wenn Sie das Ergebnis in dem Aufruf Fragment behandeln müssen, und es ist zur Zeit nicht arbeiten, können Sie ein Ausbreitung Problem. Diese Art von Problem wurde ausführlich in this post beschrieben.

Ein ausführlicher Artikel über startActivityForResult und verschachteltes Fragment kann here gefunden werden.

+0

Hallo Bonnyz, ich habe versucht mit oben getActivity(). StartActivityForResult() code .. das funktioniert auch nicht .. hier, keine Notwendigkeit, Daten von der Elternaktivität zu fragent oder Fragment zu übergeordnete Aktivität zu senden .. – harikrishnan

+0

nur, innerhalb Fragment Klasse, öffnen Sie einfach Galerie und wählen Sie ein Bild und zeigen Sie in Bildansicht .. das ist es .. das sind alle nur innerhalb Fragment Klasse getan .. – harikrishnan

+0

@harikrishnan Also, wenn nötig, um das onActivtyResult direkt im Fragment zu starten/erhalten Werfen Sie einen Blick auf den zweiten Teil der Antwort, der über das Vermehrungsproblem spricht – bonnyz

0

Wenn der obige Code nicht funktioniert, sollten Sie Ihre Fragment Import-Anweisung überprüfen.

Ich denke, Sie verwenden Fragment in Fragment. Wenn ja, bitte posten Sie Ihren Importcode.

+0

Ja Rahul .. hier verwende ich Material Registerkarte FRagment.inside eine TabFragment Klasse. Ich möchte tun, wie Bild aus Galerie auswählen und auf Web-Services hochladen .. – harikrishnan

+0

Code nur startActivityForResult() bis .. nächste öffentliche void onActivityResult (int requestCode, int resultCode, Intent Daten) {} Methode nicht aufgerufen .. Thats mein Problem..ich möchte das nur innerhalb der Fragmentklasse machen. Ich möchte nicht irgendwelche Daten von Fragment zu Tätigkeit übertragen ..... – harikrishnan

+0

ok versuchen, getActivity.startActivityForResult zu verwenden und mir das Ergebnis zu geben –

0

Ich hoffe, dies hilft Ihnen.

Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    startActivityForResult(i, RESULT_LOAD_IMAGE); 
// write this in your fragment or method or listener which will invoke gallery. 

dann schreiben Sie dies in Ihrem Fragment

public void onActivityResult(int requestCode, int resultCode, Intent data){ 
if (requestCode == RESULT_LOAD_IMAGE && resultCode == getActivity().RESULT_OK 
      && null != data) { 
     Uri selectedImage = data.getData(); 
     String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = getActivity().getContentResolver().query(selectedImage, 
       filePathColumn, null, null, null); 
     cursor.moveToFirst(); 
     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String picturePath = cursor.getString(columnIndex); 
     Log.d("Picture Path", "Picture Path:"+picturePath); 

     long total_Images_size=0; 

     File f=new File(picturePath); 
     //total_Images_size+=f.length(); 
     /*if(total_Images_size>MAX_IMAGE_FILES_SIZE) 
     { 
      Toast.makeText(getActivity(), "Image attachments size cannot exceed 5MB(total).", Toast.LENGTH_LONG).show(); 
      return; 
     }*/ 
     String selectedFilename=picturePath.substring(picturePath.lastIndexOf("/")); 

     addPicture(picturePath, imageCount); 


    } 

Versuchen und lassen Sie es mich wissen, ob es irgendwelche error.Thanks ist

+0

ich benutze diese Lösung, aber es tut nicht Arbeit –

0

Wenn Sie auf einem Fragment diesen Code verwenden, die angebracht ist, eine Aktivität, dann:

  1. getActivity().startActivityForResult() dieaufrufender Aktivität.

  2. startActivityForResult() wird sowohl die onActivityResult() der Aktivität und des Fragments aufrufen. Das Problem hierbei ist, dass der onActivityResult() des Fragments den richtigen requestCode bekommt. Aber das der Aktivität wird einen modifizierten requestCode bekommen.

Dies ist jedoch nicht der Fall für verschachtelte Fragmente. Rufen Sie bei NestedFragments immer getActivity().startActivityForResult() auf und bearbeiten Sie das Ergebnis in der onActivityResult() der Aktivität. Wenn Sie keine starke Abhängigkeit zwischen Fragmenten und Aktivitäten erstellen möchten, müssen Sie ein Entwurfsmuster haben, das diese Entkopplung durchführt (ich verwende hierfür die Otto-Bibliothek).Noch besser ist es, immer das getActivity().startActivityForResult() aus dem Fragment zu wählen, das an die Aktivität angehängt ist, anstatt das verschachtelte.

Best Practice: Aus meiner Erfahrung, behandeln Sie die onActivityResult() nur in Aktivität! Dies wird eine Menge Wartung Albtraum reduzieren. Verwenden Sie einen anderen Mechanismus, um dies an die Fragmente zu delegieren.

0

Da Sie nur ein Bild aus dem Galeriebegriff abrufen und Ihre Bildansicht in Ihrem FRAGMENT ausfüllen möchten, können Sie in Ihrer Aktivität einen Verweis auf diese Bildansicht halten und getActivity().startActivityForResult() verwenden und dann die Bitmap für festlegen die Imageview-Referenz in Ihrer Aktivität

Code:

// YOUR FRAGMENT 

// fragment code... 
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY_INTENT_CALLED); 
} else { 
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.setType("image/*"); 
    // Update your activity's imageview reference 
    mListener.setImageViewRef(fragmentImgView); 
    getActivity().startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED); 
} 

// more code.. 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    try { 
     mListener = (OnFragmentInteractionListener) getActivity(); 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnFragmentInteractionListener"); 
    } 
} 

// Create interface to communicate with your activity 

public interface OnFragmentInteractionListener { 
    void setImageViewRef(ImageView imgView); 
} 

// END FRAGMENT CODE. 

// YOUR ACTIVITY 

public class MyActivity extends FragmentActivity implements MyFragment.OnFragmentInteractionListener { 
    ... 
    private ImageView myFragmentsImageViewReference; 
    ... 
    @Override 
    void setImageViewRef(ImageView imgView) { 
     this.myFragmentsImageViewReference = imgView; 
    } 

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

     ... get Image from intent ... 
     myFragmentsImageViewReference.setImageBitmap(myBitmapRetrievedFromIntent); 
     ... 
    } 
} 

// END ACTIVITY CODE 
0

Sie bitte Ihre Tätigkeit des überprüfen onActivityResult() -Methode, wenn Sie in Fragment des onActivityResult nicht Rückruf aufgerufen wird immer bekommen() Ifyou werden Rückruf in übergeordnete Aktivität bekommen, dann können Sie aufrufen. Fragments onActivityResult() Methode von dort ... Sag mir, wenn Sie mehr Hilfe brauchen ...

Verwandte Themen