2011-10-07 208 views
34

是否可以在Android應用程序中只彈出一個圖像?它類似於覆蓋AlertDialog的正常視圖,因此它只包含圖像而沒有其他內容。Android圖像對話框/彈出窗口

SOLUTION:感謝@ blessenm的幫助,我找到了答案。掩蓋作爲對話的活動似乎是理想的方式。以下是我用過的代碼。根據需要由應用程序以同樣的方式一個新的活動將開始

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> 

此對話框風格的活動可以被調用爲完成此操作設置以下樣式至關重要:

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> 

最後一步是在清單申報這種風格的活動如下:

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

爲什麼使用對話框風格活動,而不是一個對話本身做上述功能。它的任何具體原因,或只是一個設計選擇? – Avijeet

+0

@Avijeet這是一個有效的問題,目標是展示一個浮動圖像 - 這是幾年前,當時視圖定製並不普遍。所以,將一個活動稱爲對話框是有意義的。事後看來,我可以使用'PopupWindow'或滾動我自己的自定義視圖 – Abhijit

回答

28

如果你只是想使用版本notmal對話這樣的事情應該工作

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

感謝您的迴應 - 這確實有效,但只是部分。該對話框仍然包含灰色背景和白色筆觸ala Android AlertDialog的樣式。我的意圖是讓圖像替換傳統的警報對話框。 – Abhijit

+1

要刪除所有默認樣式,您應該添加自己的樣式並覆蓋默認值。這可能有幫助。 http://www.anddev.org/custom_theme_dialog___transparent_background-t7300.html – blessenm

+0

謝謝!這非常有幫助。 – Abhijit

1

有幾個方法,你可以做這個。但是,如果您希望圖像看起來浮動在現有活動之上,則可能需要使用清單中定義的android:theme =「@ style/Theme.Transparent」的活動。然後,設計您的佈局,讓一個ImageView位於屏幕中央。用戶將不得不按下後退按鈕才能擺脫這種情況,但聽起來這就是您想要的。

如果你希望它看起來像一個實際的對話框,你總是可以使用對話式風格的活動以及使用Theme.Dialog。或者,您可以使用對話框並對其進行自定義。

+0

非常感謝!我的想法是讓圖像替換AlertDialog,但隨着用戶點擊它而消失。所以,整個圖像空間本質上是一個「OK」按鈕。我會盡力處理你的第一個建議並回復你。另外,當你說自定義一個對話框時,你的意思是我爲一個對話子類並覆蓋了這些方法? – Abhijit

2

更靈活和推薦的方法是使用DialogFragment。如果你想支持3.0纔可以使用兼容性庫

+5

你可能會更精緻一點嗎? – Abhijit

44

沒有XML :

public void showImage() { 
    Dialog builder = new Dialog(this); 
    builder.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    builder.getWindow().setBackgroundDrawable(
     new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
    builder.setOnDismissListener(new DialogInterface.OnDismissListener() { 
     @Override 
     public void onDismiss(DialogInterface dialogInterface) { 
      //nothing; 
     } 
    }); 

    ImageView imageView = new ImageView(this); 
    imageView.setImageURI(imageUri); 
    builder.addContentView(imageView, new RelativeLayout.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT, 
      ViewGroup.LayoutParams.MATCH_PARENT)); 
    builder.show(); 
} 
+0

我用這個,但我什麼都看不到? –

+1

@ShylendraMadda它可能不工作,如果圖像很大 –

+0

非常感謝! :) –

0

嘗試以下操作:
它具有圖像zoom_in/zoom_out爲好。

第1步:
添加compile 'com.github.chrisbanes.photoview:library:1.2.4'build.gradle
第2步:
添加下面的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> 

步驟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(); 

} 

步驟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); 
    } 
});