İçerik eklenmeden önce requestFeature () yöntemi çağrılmalıdır


135

Özel bir başlık çubuğu uygulamaya çalışıyorum:

İşte yardımcı sınıfım:

import android.app.Activity;
import android.view.Window;

public class UIHelper {
    public static void setupTitleBar(Activity c) {
        final boolean customTitleSupported = c.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

        c.setContentView(R.layout.main);

        if (customTitleSupported) {
            c.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);
        }
    }
}

Burada onCreate () olarak adlandırdığım yer:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setupUI();
}

private void setupUI(){
     setContentView(R.layout.main);
     UIHelper.setupTitleBar(this);
}

Ama hatayı alıyorum:

requestFeature() must be called before adding content

Yanıtlar:


331

Hata mesajının size söylediklerini yapın.

Daha setContentView()önce arama requestFeature().

Not:

Yorumlar dedi gibi, her ikisi için ActionBarSherlockve AppCompatkütüphanede, bu çağırmak gerekli requestFeature()öncesuper.onCreate()


60
kahretsin, bu klas bir cevap.
Bir Kişi

60
ActionBarSherlock için daha requestFeature()önce de aramak gerekir super.onCreate(). Referans: github.com/JakeWharton/ActionBarSherlock/issues/…
Saran

1
Bir düzeni başlık çubuğu olmadan göstermeniz ve ardından başlık çubuğu içeren bir düzeni göstermeniz gerekiyorsa ne olur? Sen kullanmak zorunda olacak requestWindowFeature(Window.FEATURE_NO_TITLE)o zaman, bunu saklamaya setContentView()sonra, ilk düzeni için requestWindowFeature(Window.FEATURE_CUSTOM_TITLE)tekrar başlık çubuğunu göstermek için. Bu setContentView()ikinci seferden sonra olurdu .
msbg

35
@Saran'ın dediği gibi AppCompat'ta da aynı durum söz konusudur. Daha requestFeatureönce aramalısınsuper.onCreate()
Jaison Brooks

7
Bu cevap pek yardımcı olmuyor ... ama ne biliyorum
Ojonugwa Jude Ochalifu

23

Biliyorum bir yaşın üzerinde, ama aramak requestFeature()asla sorunumu çözmedi. Aslında ben hiç demiyorum.

Sanırım bu görüşü şişirmekle ilgili bir sorundu. Tüm araştırmalarıma rağmen, farklı bir bakış açısı şişirme yöntemleriyle oynayana kadar hiçbir zaman uygun bir çözüm bulamadım.

AlertDialog.Builder kolay bir çözümdür, ancak onPrepareDialog()bu görünümü güncellemek için kullanıyorsanız çok çalışma gerektirir .

Başka bir alternatif de diyaloglar için AsyncTask'ten faydalanmaktır.

Kullandığım son çözüm aşağıda:

public class CustomDialog extends AlertDialog {

   private View content;

   public CustomDialog(Context context) {
       super(context);

       LayoutInflater li = LayoutInflater.from(context);
       content = li.inflate(R.layout.custom_view, null);

       setUpAdditionalStuff(); // do more view cleanup
       setView(content);           
   }

   private void setUpAdditionalStuff() {
       // ...
   }

   // Call ((CustomDialog) dialog).prepare() in the onPrepareDialog() method  
   public void prepare() {
       setTitle(R.string.custom_title);
       setIcon( getIcon() );
       // ...
   }
}

* Bazı Ek Notlar:

  1. Başlığı gizlemeye güvenmeyin. Başlık belirlenmemesine rağmen genellikle boş bir alan vardır.
  2. Üstbilgi altbilgisi ve orta görünüm ile kendi Görünümünüzü oluşturmaya çalışmayın. Yukarıda belirtildiği gibi başlık, FEATURE_NO_TITLE istenmesine rağmen tamamen gizli olmayabilir.
  3. İçerik görünümünüzü renk özellikleri veya metin boyutuyla büyük ölçüde şekillendirmeyin. İletişim kutusunun bunu ele almasına izin verin, aksi takdirde satıcı renkleri ters çevirdiğinden koyu mavi bir iletişim kutusuna siyah metin koyma riskiniz vardır.

Başlangıçta onCreate () yönteminde setTitle () ve setIcon () yayınladım, ancak düzenleme onu onPrepareDialog () yöntemi sırasında çağrılan prepar () yöntemine taşıdı.
Cookster

2
Paylaşım için teşekkürler. Bence şu satır content = inflater.inflate(R.layout.custom_view, null);muhtemelen olmalı content = li.inflate(R.layout.custom_view, null);. Yani, inflateryerine geçmelidir li.
aLearner

14

Bir DialogFragment genişletiyordum ve yukarıdaki cevap işe yaramadı. Başlığı kaldırmak için getDialog () kullanmak zorunda kaldı:

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

@ojonugwaochalifu bir süre geri döndü, bu yüzden tam olarak hatırlamıyorum ama setcontentView () yönteminden önce yapılması gerektiğinden eminim
Yasadışı Argüman

1
aynı sorunla karşı karşıya herhangi biri için: Bu kodu onViewCreated ();
7geeky

2

Hata tam olarak neyin yanlış olduğunu söylemiyor mu? Aradığınız requestWindowFeatureve aradıktan setFeatureIntsonra setContentView.

Bu arada, neden setContentViewiki kez arıyorsun?


2

SDK sürüm 23 ve üstü için, etkinliğinizi genişletmek için AppCompatActivity kullanıyorsanız aynı RuntimeException oluşturulur. Etkinliğiniz doğrudan Etkinlik'ten kaynaklanıyorsa gerçekleşmez.

Bu, https://code.google.com/p/android/issues/detail?id=186440 adresinde belirtildiği gibi Google'da bilinen bir sorundur.

Bunun için sağlanan geçici çözüm requestFeature () yerine supportRequestWindowFeature () yöntemini kullanmaktır.

Sorununuzu çözüp çözmediğini lütfen oylayın.


1

Change Derleme SDK sürümü , Hedef SDK sürümü için Yapı Araçları sürümü için 24.0.0 yılında build.gradle u istek Özelliği sorunu yüz eğer


0

Benim durumumda ben gösterdi DialogFragmentiçinde Activity. DialogFragment siyah kenarlığı kaldırmak gibi yazdım bu iletişim parçası :

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setStyle(STYLE_NO_FRAME, 0)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    super.onCreateDialog(savedInstanceState)

    val dialog = Dialog(context!!, R.style.ErrorDialogTheme)
    val inflater = LayoutInflater.from(context)
    val view = inflater.inflate(R.layout.fragment_error_dialog, null, false)
    dialog.setTitle(null)
    dialog.setCancelable(true)
    dialog.setContentView(view)
    return dialog
}

Ya kaldırma setStyle(STYLE_NO_FRAME, 0)içinde onCreate()veya Chande / kaldır onCreateDialog. Diyalog ayarları oluşturulduktan sonra diyalog ayarları değiştiği için.


0

Bu sorunu API 26 çalıştıran ancak API 23 ile başarısız olan cihazlarda iyi çalışan genişletilmiş bir DialogFragment tabanlı Dialogs ile yaşadım Yukarıdaki stratejiler işe yaramadı ama (daha fazla tarafından eklenmiş onCreateView yöntemini kaldırarak sorunu çözdüm yeni Android Studio şablonu) DialogFragment'tan ve onCreateDialog'da iletişim kutusu oluşturma.

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.