2014-05-23 6 views
1

J'ai une application dans laquelle j'ai une liste personnaliséeView, en cliquant sur un élément de la liste, un DialogFramgent est montré. Maintenant, ce que je veux faire est de définir l'imageView que j'ai dans ce DialogFramgent à une image dans le stockage externe. Je sais que je peux régler la source du imageView en tant que tel:Android - définir imageView à l'intérieur de DialogFragment

File imgFile = new File(“/sdcard/Images/test_image.jpg”); 
if(imgFile.exists()){ 

    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

    ImageView myImage = (ImageView) findViewById(R.id.imageViewItem); 
    myImage.setImageBitmap(myBitmap); 

} 

Cependant, je ne pouvais pas initialiser ma variable ImageView correctement, car findViewById donne une erreur: `La méthode findViewById (int) est non défini pour le type ItemDialog .

Voici la partie dans mon listView personnalisé onClickLisenter où j'appelle mon DialogFragment:

resultListView.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> a, final View v, final int position, long id) { 

     positionSelected = position; 

     SearchResultListViewItem selectedRow = results.get(position); 
     String selectedItem = selectedRow.getItemName(); 
     itemBarcode = selectedRow.getBarcode(); 

     itemListDB.open(); 

     ItemDialog itemDialog = new ItemDialog(); 

     itemDialog.itemName = selectedItem; 
     itemDialog.brandName = itemListDB.getBrandFromItemBarcode(itemBarcode); 
     itemDialog.UOMName = itemListDB.getUOMFromItemBarcode(itemBarcode); 
     itemDialog.priceName = itemListDB.getPriceFromItemBarcode(itemBarcode); 
     itemDialog.discountName = itemListDB.getDiscountFromItemBarcode(itemBarcode); 
     itemDialog.mListener = SearchResult.this; 

     itemDialog.qtyFromList = qtyInput.get(position); 
     itemDialog.discFromList = qtyInput.get(position); 

     itemListDB.close(); 
     itemDialog.show(getFragmentManager(), ""); 

    } 
}); 

et voici ma classe ItemDialog:

public class ItemDialog extends DialogFragment implements OnClickListener{ 

    //my variables go over here 

    public interface onSubmitListener { 
     void setOnSubmitListener(String qty, String disc); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     final Dialog dialog = new Dialog(getActivity()); 
     dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     dialog.setContentView(R.layout.fragment_item_dialog); 
     setStyle(DialogFragment.STYLE_NORMAL, R.style.MyDialog); 

     File imgFile = new File("/sdcard/Images/test_image.png"); 
     if(imgFile.exists()){ 

      Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

      ImageView myImage = (ImageView) findViewById(R.id.imageViewItem); 
      myImage.setImageBitmap(myBitmap); 

     } 

     dialog.setTitle("Item Details"); 
     dialog.show(); 
     //I set more variables here  
     return dialog; 
    }  

} 

Alors, est-ce que quelqu'un a une idée sur la façon de définir l'image source d'un imageView qui est dans un DialogFragment? Je suis coincé ici et franchement, je n'ai aucune idée de la façon de procéder et je serai vraiment reconnaissant si quelqu'un peut m'aider.

Merci.

+0

Êtes-vous sûr que votre image existe dans le chemin/sdcard/Images? –

+0

Euh oui. Le problème, comme je l'ai dit, est qu'il y a un soulignement rouge dans findViweById quand j'essaie de chercher ImageView. – Razgriz

Répondre

5

Vous devez inflate mise en page dans votre Dialog Fragment sous onCreateDialog(...)

LayoutInflater layoutInflater = (LayoutInflater) getActivity() 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View layout2 = layoutInflater.inflate(R.layout.contact_filter_popup,null); 

    dialog.setView(layout2); 

puis votre référence Imageview avec ce particulier layout

ImageView img=(ImageView)layout2.findViewById(R.id.imageViewItem); 

Mise à jour:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    final Dialog dialog = new Dialog(getActivity()); 

    dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 


    LayoutInflater layoutInflater = (LayoutInflater) getActivity() 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View layout2 = layoutInflater.inflate(R.layout.contact_filter_popup,null); 
    dialog.setContentView(layout2); 

    setStyle(DialogFragment.STYLE_NORMAL, R.style.MyDialog); 

    ImageView myImage = (ImageView) layout2.findViewById(R.id.imageViewItem); 

    File imgFile = new File("/sdcard/Images/test_image.png"); 

    if(imgFile.exists()){ 

     Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
     myImage.setImageBitmap(myBitmap); 

    } 

    dialog.setTitle("Item Details"); 
    dialog.show(); 

    return dialog; 
}  
+0

Désolé pour la question stupide, mais où exactement je l'ai mis dans ma fonction 'onCreateDialog (..)'? – Razgriz

+0

@Razgriz yup.wait malade mettre à jour ma réponse. –

+0

Merci. Cela marche.Je viens de changer la disposition de 'contact_filter_popup' à' fragment_item_dialog' (le mien). Maintenant, je reçois un NullPointer de 'myImage.setImageBitmap (myBitmap);'. Cependant, pour une autre question, je pourrais avoir des problèmes avec le chemin ou quelque chose. – Razgriz

1

Fragments n'ont pas la méthode findViewById, vous pouvez appeler la méthode getView() du fragment e:

File imgFile = new File(“/sdcard/Images/test_image.jpg”); 
    if(imgFile.exists()){ 
    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
    ImageView myImage = (ImageView) getView().findViewById(R.id.imageViewItem); 
    myImage.setImageBitmap(myBitmap); 
    } 

Je suppose que vous avez déjà gonflé la vue correspondante du DialogFragment.

Pour plus d'informations: http://developer.android.com/reference/android/app/Fragment.html#getView()

2

Le problème est dû à la non-concordance du cycle de vie. Dans un fragment de dialogue lorsque la boîte de dialogue est créée, cela ne signifie pas que les vues sont créées. Cela entraînera IllegalArgumentException en raison du fragment non lié à l'activité. Pour surmonter cela toujours utiliser/accéder à vos vues après que les vues sont gonflées dans la méthode onViewsCreated()/onCreateViews(). Trouvez ma solution ci-dessous qui fonctionne bien.

public class ImageDetailDialog extends DialogFragment implements OnClickListener{ 

    private String url ; 

    private ImageView imgProdDetail; 


    /* (non-Javadoc) 
    * @see android.support.v4.app.DialogFragment#onCreate(android.os.Bundle) 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     url = getArguments().getString("url"); 
     setStyle(DialogFragment.STYLE_NO_TITLE, R.style.product_dialog); 
    } 

    /* (non-Javadoc) 
    * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.image_detail_dialog, null); 
     imgProdDetail = (ImageView)view.findViewById(R.id.img_prod_detail); 
     view.setOnClickListener(this); 
     return view; 
    } 

    /* (non-Javadoc) 
    * @see android.support.v4.app.Fragment#onViewCreated(android.view.View, android.os.Bundle) 
    */ 
    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

      /** Decode/load YOUR IMAGE HERE **/ 
     imgProdDetail.setImageResource(R.drawable.image); 
    } 

    /* (non-Javadoc) 
    * @see android.support.v4.app.DialogFragment#onCreateDialog(android.os.Bundle) 
    */ 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Dialog dialog = super.onCreateDialog(savedInstanceState); 
     dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
     //not working 
     dialog.setCanceledOnTouchOutside(true); 
     return dialog; 
    } 

    /* (non-Javadoc) 
    * @see android.view.View.OnClickListener#onClick(android.view.View) 
    */ 
    @Override 
    public void onClick(View v) { 
     if(v!=imgProdDetail) 
      this.dismissAllowingStateLoss(); 
    } 

} 
1

essayer de passer outre la méthode de rappel onCreateView(), comme un fragment, DialogFragment peut être gonflé avec cette méthode afin que vous puissiez plus tard inlfate votre mise en page et de trouver la référence imageview.

Questions connexes