2011-10-07 26 views
34

E 'possibile avere solo un'immagine popup/comparsa in un'applicazione Android? È simile a un override della normale visualizzazione di un AlertDialog in modo che contenga solo un'immagine e nient'altro.Finestra di dialogo Immagine Android/Popup

SOLUZIONE:Sono stato in grado di trovare una risposta grazie all'aiuto di @ blessenm. Mascherare un'attività come una finestra di dialogo sembra essere il modo ideale. Quello che segue è il codice che ho usato. Questa attività finestra in stile può essere invocata come necessaria per l'applicazione allo stesso modo in cui una nuova attività sarebbe iniziata

ImageDialog.java

public class ImageDialog extends Activity { 

    private ImageView mDialog; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.your_dialog_layout); 



     mDialog = (ImageView)findViewById(R.id.your_image); 
     mDialog.setClickable(true); 


     //finish the activity (dismiss the image dialog) if the user clicks 
     //anywhere on the image 
     mDialog.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
     }); 

    } 
} 

your_dialog_layout.xml

<?xml version="1.0" encoding="UTF-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/image_dialog_root" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@android:color/transparent" 
    android:gravity = "center"> 

    <ImageView 
     android:id="@+id/your_image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src = "@drawable/your_image_drawable"/> 

</FrameLayout> 

È fondamentale impostare lo stile seguente per l'attività per ottenere ciò:

styles.xml

<style name="myDialogTheme" parent="@android:style/Theme.Dialog"> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowFrame">@null</item> 
    <item name="android:background">@android:color/transparent</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:backgroundDimEnabled">false</item> 
    <item name="android:windowContentOverlay">@null</item> 
    </style> 

Il passo finale è quello di dichiarare questo stile per l'attività nel manifesto come segue:

<activity android:name=".ImageDialog" android:theme="@style/myDialogTheme" /> 
+0

perchè usando un'attività di dialogo stile e non una finestra di dialogo in sé a fare la funzionalità di cui sopra. Qualche ragione specifica per questo, o solo una scelta di design? – Avijeet

+0

@Avijeet è una domanda valida, l'obiettivo era mostrare un'immagine fluttuante - questo era qualche anno fa, però, quando la personalizzazione della vista non era così diffusa. Quindi, aveva senso avere un'attività in stile come un dialogo. Con il senno di poi, avrei potuto usare un 'PopupWindow' o aver ruotato la mia vista personalizzata – Abhijit

risposta

28

Se si desidera utilizzare una finestra qualcosa notmal come questo dovrebbe funzionare

Dialog settingsDialog = new Dialog(this); 
settingsDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
settingsDialog.setContentView(getLayoutInflater().inflate(R.layout.image_layout 
     , null)); 
settingsDialog.show(); 

image_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" android:layout_height="wrap_content" 
    android:orientation="vertical"> 
    <ImageView android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:src="YOUR IMAGE"/> 
    <Button android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:text="OK" android:onClick="dismissListener"/> 
</LinearLayout> 
+0

Grazie per la risposta: funziona, ma solo parzialmente. La finestra di dialogo sarebbe comunque composta dallo sfondo grigio e dal tratto bianco per lo stile di un AlertDialog Android. La mia intenzione è di avere un'immagine che sostituisca la finestra di avviso convenzionale. – Abhijit

+1

Per rimuovere tutti gli stili predefiniti, è necessario aggiungere il proprio stile e oltrepassare i valori predefiniti. Questo potrebbe aiutare. http://www.anddev.org/custom_theme_dialog___transparent_background-t7300.html – blessenm

+0

Grazie! E 'stato molto utile. – Abhijit

1

C'è un paio di modi si può Fai questo. Ma, se stai cercando di far sembrare che l'immagine fluttui sopra la tua attività esistente, potresti voler utilizzare un'attività con Android: theme = "@ style/Theme.Transparent" definito nel manifest. Quindi, progetta il tuo layout per avere solo una singola ImageView posizionata al centro dello schermo. L'utente dovrà premere il pulsante Indietro per uscire da questo, ma sembra che sia quello che vuoi.

Se si desidera che assomigli a una finestra di dialogo effettiva, è sempre possibile utilizzare anche una finestra di dialogo con stile utilizzando Theme.Dialog. O, puoi semplicemente usare una finestra di dialogo e personalizzarla.

+0

Grazie mille! La mia idea è di avere un'immagine che sostituisca AlertDialog ma scompare quando l'utente tocca/fa clic su di esso. Quindi, in sostanza, l'intero spazio dell'immagine funziona come un pulsante "OK". Cercherò di lavorare con il tuo primo suggerimento e tornare da te. Inoltre, quando dici di personalizzare una finestra di dialogo, intendi che sottoclassi una finestra di dialogo e sovrascrivi i metodi? – Abhijit

2

Il modo più flessibile e consigliato è utilizzare DialogFragment. Se si desidera supportare le versioni prima di 3.0 è possibile utilizzare libreria di compatibilità

+5

Potresti essere un po 'più elaborato? – Abhijit

44

No xml :

+0

L'ho usato ma non riesco a vedere nulla? –

+1

@ShylendraMadda potrebbe non funzionare se l'immagine è enorme –

+0

Grazie mille! :) –

0

Provare quanto segue:
Ha immagine Zoom_in/Zoom_out pure.

Fase 1:
Aggiungi compile 'com.github.chrisbanes.photoview:library:1.2.4' al build.gradle
Fase 2:
Aggiungere il seguente codice XML


custom_fullimage_dialoge.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/layout_root" android:orientation="horizontal" 
       android:layout_width="fill_parent" android:layout_height="fill_parent" 
       android:padding="10dp"> 
    <ImageView android:id="@+id/fullimage" android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
    </ImageView> 

    <TextView android:id="@+id/custom_fullimage_placename" 
       android:layout_width="wrap_content" android:layout_height="fill_parent" 
       android:textColor="#FFF"> 
    </TextView> 
</LinearLayout> 

Fase 3:

private void loadPhoto(ImageView imageView, int width, int height) { 

    final Dialog dialog = new Dialog(this); 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
    //dialog.setContentView(R.layout.custom_fullimage_dialog); 
    LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); 
    View layout = inflater.inflate(R.layout.custom_fullimage_dialog, 
      (ViewGroup) findViewById(R.id.layout_root)); 
    ImageView image = (ImageView) layout.findViewById(R.id.fullimage); 
    image.setImageDrawable(imageView.getDrawable()); 
    image.getLayoutParams().height = height; 
    image.getLayoutParams().width = width; 
    mAttacher = new PhotoViewAttacher(image); 
    image.requestLayout(); 
    dialog.setContentView(layout); 
    dialog.show(); 

} 

Fase 4:

user_Image.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Display display = getWindowManager().getDefaultDisplay(); 
     int width = display.getWidth(); 
     int height = display.getHeight(); 
     loadPhoto(user_Image,width,height); 
    } 
}); 
Problemi correlati