Başlıksız bir DialogFragment nasıl oluşturulur?


359

Uygulamamla ilgili bazı yardım mesajlarını göstermek için bir DialogFragment oluşturuyorum. Her şey bir şey yanında iyi çalışıyor: Pencerenin üst kısmında DialogFragment'ı gösteren siyah bir şerit var, sanırım başlık için ayrılmış, kullanmak istemediğim bir şey.

Özel DialogFragment'ım beyaz bir arka plan kullandığından bu özellikle acı verici, bu nedenle değişiklik bir kenara bırakılamayacak kadar kötü şöhretli.

Size bunu daha grafiksel olarak göstereyim:

resim açıklamasını buraya girin

Şimdi DialogFragment için XML kodu aşağıdaki gibidir:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:id="@+id/holding" 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:background="@drawable/dialog_fragment_bg"
        >
        <!-- Usamos un LinearLayout para que la imagen y el texto esten bien alineados -->
        <LinearLayout
            android:id="@+id/confirmationToast" 
            android:orientation="horizontal" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            >

            <TextView android:id="@+id/confirmationToastText" 
            android:layout_width="wrap_content"
            android:layout_height="fill_parent" 
            android:text="@string/help_dialog_fragment"
            android:textColor="#AE0000"
            android:gravity="center_vertical"
            />

        </LinearLayout>
        <LinearLayout
            android:id="@+id/confirmationButtonLL" 
            android:orientation="horizontal" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"
            android:gravity="center_horizontal"
            >    
            <Button android:id="@+id/confirmationDialogButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:layout_marginBottom="60dp"
                android:background="@drawable/ok_button">
            </Button>
        </LinearLayout>
    </LinearLayout>
</ScrollView>

Ve DialogFragment'ı uygulayan sınıfın kodu:

public class HelpDialog extends DialogFragment {

    public HelpDialog() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //Inflate the XML view for the help dialog fragment
        View view = inflater.inflate(R.layout.help_dialog_fragment, container);
        TextView text = (TextView)view.findViewById(R.id.confirmationToastText);
        text.setText(Html.fromHtml(getString(R.string.help_dialog_fragment)));
        //get the OK button and add a Listener
        ((Button) view.findViewById(R.id.confirmationDialogButton)).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                 // When button is clicked, call up to owning activity.
                HelpDialog.this.dismiss();
             }
         });
        return view;
    }

}

Ve ana Faaliyetteki yaratım süreci:

/**
 * Shows the HelpDialog Fragment
 */
private void showHelpDialog() {
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    HelpDialog helpDialog = new HelpDialog();
    helpDialog.show(fm, "fragment_help");
}

Bir Dialog ile ilgili bu cevabın Android'e de uyup uymadığını gerçekten bilmiyorum : Başlıksız bir Diyalog nasıl oluşturulur?

Bu başlık alanından nasıl kurtulabilirim?


Bu showHelpDialog yöntemi FragmentActivity veya Activity sınıfından çağrılır ??
Sjk

81
+1 ... Bence bu soru okurken ilk güldüğüm lol
Jason Crosby

1
Mizah duygusu için +1. Sorunun grafiksel açıklaması tam olarak bu sorun hakkında nasıl hissettiğim oldu!
Luis Artola

Yanıtlar:


589

Bu kod satırını HelpDialog.onCreateView(...)

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

Bu şekilde açıkça başlıksız bir pencere almanızı istiyorsunuz :)


DÜZENLE

As @DataGrahamve @Blundellaşağıda yorumlarda dikkat çeken, bu bir başlık daha az pencere için istek eklemek için güvenlidir onCreateDialog()yerine yöntemle onCreateView(). Bu şekilde, parçanızı aşağıdaki gibi kullanmadığınızda can sıkıcı NPE'yi önleyebilirsiniz Dialog:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
  Dialog dialog = super.onCreateDialog(savedInstanceState);

  // request a window without the title
  dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
  return dialog;
}

61
Tabii ki kolaylık yöntemini de kullanabilirsiniz getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)...
a.bertucci

8
Yerine onCreateDialog bunu isteyebilir, ihtimaline karşı parçası gösterilmektedir değil bir diyalog olarak.
DataGraham

2
@ a.bertucci sen en iyisisin! Bununla birlikte, bu parçayı normal bir Parça olarak eklerseniz, getDialogsize bir NPE döndürür
Blundell

4
Bu, iletişim kutusumun genişliğini daraltır. Bu sorunla ilgili herhangi bir geçici çözüm var mı?
clocksmith

2
@clocksmith android:layout_widthiletişim kutusunun düzenindeki kök görünümün niteliği wrap_contentnedir?
ataulm

78

İletişim kutusunun, görünüm oluşturma Java Doc'dan önce çağrılması gereken setStyle yöntemi vardır . Ayrıca iletişim kutusunun stili aynı yöntemle ayarlanabilir

public static MyDialogFragment newInstance() {
        MyDialogFragment mDialogFragment = new MyDialogFragment();
        //Set Arguments here if needed for dialog auto recreation on screen rotation
        mDialogFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        return mDialogFragment;
}

3
Max, setStype (STYLE_NO_TITLE, 0) kullanmaya çalıştım. Ancak sonuç, iletişim kutusumun genişliğinin 1/4 boyutuna kesilmesidir, bu nedenle iletişim kutusundaki mesaj tüm gösterilmez.
vliux

1
Bence android kaynaklarına bakmanın iki yolu aslında aynı kodda. Ben de aynı sorunu yaşıyorum 1/4 boyutunu da kesiyor olsa da :(. Henüz
çözmedim

1
Bunu yapmanın en iyi yolu budur.
Psypher

1
@Sam Haklısınız, Window stili onSaveInstanceState öğesinde kalıcı olarak kalır ve daha sonra geri yüklenir. Hala onCreate () 'de her şeyi başlatmak için daha iyi bir uygulama olduğuna inanıyorum.
BladeCoder

1
Düzeninizin kök görünümüne sahip tüm doğrudan çocuklar bir match_parant genişliği olmalıdır. Sonra normal genişlikte bir iletişim kutusu alırsınız.
nicolausYes

22
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");

1
sd.setStyle (DialogFragment.STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar) söyleyebilirim
Androider

OMG çok denemeden sonra, işe yarayan tek parça bu.
Alex

16

Kolay yolu deneyin

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, 0);
}

Samsung Galaxy S4 üzerinde iyi çalışıyor.
CoolMind

11
public class LoginDialog extends DialogFragment {   
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.login_dialog, null);
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        return view;
    }   
}

10

Stili Theme_Holo_Dialog_NoActionBar olarak ayarlayın:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar);
}
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.