Özel DialogFragment'ı Parça üzerinde saydam hale getiremiyorum


102

Bir parça üzerinde (tüm ekranı kaplayan) bir iletişim kutusu oluşturmam gerekiyor. İletişim kutusunun, parçanın dışında karartılmış parça ile parçanın üzerine konumlandırılacak yüzen bir iletişim kutusu olması gerekir ..

Özel Diyalog için, ne yaparsam yapayım, diyalogun her tarafında siyah bir kenarlık var (çok küçük). Saydam yapmak ve uzaklaşmak için her şeyi denedim (böylece tüm iletişim kutusu sadece doğrusal düzen - eğimli kutu)

DialogFragment için, onCreateView için sahip olduğum şey bu

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    LinearLayout layout =(LinearLayout)inflater.inflate(R.layout.custom_dialog, null);
    LinearLayout item = (LinearLayout)layout.findViewById(R.id.display_item);
    populateItemData(item, inflater);
    return layout;
}

custom_dialog sadece android: backgroung # 000000 olarak ayarlanmış bir LinearLayout'tur

Bu benim özel diyalog için tarzım

<style name="CustomDialog" parent="android:style/Theme.Dialog">
    <item name="android:windowBackground">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:alwaysDrawnWithCache">false</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

Bu stilde her türlü kombinasyonu denedim (çevrimiçi olarak gördüğümden) ve bu sinir bozucu siyah kenarlıktan kurtulamıyorum, LinearLayout arka planını başka bir şeye ayarlarsam beyaz veya başka bir renge boyayabilirim. # 000000 ...

Bunun için tam anlamıyla 3-4 saat geçirdim, umarım başka biri yardımcı olabilir ...

Yanıtlar:


309

Deneyin

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

sizin de DialogFragment'sonCreateView


5
Ayrıca yarı şeffaf siyah arka planı (karartma) kaldırmak isteyebilirsiniz, şu yanıtı kontrol edin: stackoverflow.com/a/33800422/2115904
Andriy Bas

4
Tüm kenar boşluklarını da kaldırır .. İletişim kutusu tam genişliğe genişletilir.
Uday

1
Ve bu bir istisna neden olur: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference.
CoolMind

1
Ayrıca getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);bunun yerine arayabilirsiniz . Bunun bir istisnayı çağırmaması için DialogFragment, FragmentTransaction'ın dialogFragment.show(...);değil, Activity veya Fragment'den yöntemle çağırmalısınız add.
CoolMind

2
Durumda birileri Kotlin pasajı arıyor, işte burada: dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)).
Francis Laclé

24

Bunu deneyin ( % 100 özel bir DialogFragment'ı nasıl oluştururum ) bu iletişim kutusu için çalışır

    Dialog dialog = new Dialog(getActivity());

    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

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

        // layout to display
    dialog.setContentView(R.layout.add_edit);

    // set color transpartent
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    dialog.show();

15

Temanızı benim için çalışacak şekilde ayarlayın

<style name="MyDialog" parent="Base.Theme.AppCompat.Light.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

Ve diyalog parça setinizde bunun gibi

public class Progress extends DialogFragment {


int style = DialogFragment.STYLE_NO_TITLE;
int theme = R.style.MyDialog;

public Progress() {
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(style, theme);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.progress, container, false);
}
}

11

İçinde onActivityCreated

getDialog().getWindow().getAttributes().alpha = 0.9f; // An alpha value to apply to this entire window. An alpha of 1.0 means fully opaque and 0.0 means fully transparent

için DialogFragmentşeffaf


8

Tamamen şeffaf kullanım için: setStyle (DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

Özel arkaplan için - değerler klasörünüzde (değerler / stil.xml) bir stil dosyası oluşturun ve bunu kullanın: setStyle (DialogFragment.STYLE_NO_FRAME, paketiniz.R.style.YOURE_CUSTOM_STYLE);

stil dosyanızda atribute : android: windowBackground öğesini @ color / DialogBackgroundBlackSemiTransparent olarak geçersiz kılın


7

Bunu Dialog Fragment veya BottomSheetDialogFragment'a ekleyerek başarabilirsiniz.

In onCreateDialogYöntemi

@Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
       Dialog dialog = super.onCreateDialog(savedInstanceState);
       dialog.getWindow().setGravity(Gravity.BOTTOM);
       dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
       dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
       return dialog;
   }

setBackgroundDrawableResourceve clearFlagsbenim için çalışıyor (kotlin, android api v28)
Wesely

6
<style name="BaseDialogTheme" parent="Base.Theme.AppCompat.Light.Dialog">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="colorControlNormal">@color/colorAccent</item>
    <item name="colorControlActivated">@color/colorAccent</item>

    <item name="android:windowFullscreen">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:colorBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>


    <item name="android:windowIsFloating">true</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:windowActionModeOverlay">false</item>
    <item name="android:windowCloseOnTouchOutside">true</item>
    <item name="android:backgroundDimAmount">.00</item>//this line is changed alpha from 1.0 to 0.0(full transparent) 

</style>



@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_FRAME, R.style.BaseDialogTheme);
    }

4

İçinde AlertDialog oluşturucu kullanan kişiler onCreateDialogyerine onCreateViewkod aşağıdaki gibi tema atayabilirsiniz. Tam tema seti R.style'dan bulunabilir . Bazılarının son zamanlarda desteklendiğini ve eski cihaz telefonlarında bulunmadığını unutmayın.

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Translucent);
        View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_album, null);
        builder.setView(view);

        return builder.create();
    }

Teşekkürler, aradığım şey buydu.
Milad Faridnia

3

Aşağıdakileri yapmak isterseniz bunu deneyin:

public TransparentDialog()
{
    super();
    setStyle(STYLE_NO_FRAME, R.style.AppTheme);
}

0

Kabul edilen cevap başına Kotlin'de

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    var v = super.onCreateView(inflater, container, savedInstanceState)
    dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    return v
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.