requestFeature () harus dipanggil sebelum menambahkan konten

138

Saya mencoba menerapkan bilah judul khusus:

Ini kelas Helper saya:

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

Di sinilah saya menyebutnya di onCreate ():

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

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

Tapi saya mendapatkan kesalahan:

requestFeature() must be called before adding content
Sheehan Alam
sumber

Jawaban:

336

Lakukan saja apa yang diperintahkan oleh pesan kesalahan tersebut.

Jangan menelepon setContentView()sebelumnya requestFeature().

catatan:

Seperti yang dikatakan di komentar, untuk keduanya ActionBarSherlockdan AppCompatperpustakaan, perlu menelepon requestFeature()sebelumnyasuper.onCreate()

Oktavianus A. Damiean
sumber
60
Sial, ini jawaban yang berkelas.
Seseorang
60
Untuk ActionBarSherlock, panggilan juga perlu dilakukan requestFeature()sebelumnya super.onCreate(). Referensi: github.com/JakeWharton/ActionBarSherlock/issues/…
Saran
1
Bagaimana jika Anda perlu menampilkan satu tata letak tanpa bilah judul dan kemudian menampilkannya dengan bilah judul? Anda harus menggunakan requestWindowFeature(Window.FEATURE_NO_TITLE)untuk menyembunyikannya, lalu setContentView()untuk tata letak pertama Anda, lalu requestWindowFeature(Window.FEATURE_CUSTOM_TITLE)menampilkan bilah judul lagi. Itu akan terjadi setelah setContentView()yang kedua kalinya.
msbg
35
Ini kasus yang sama di AppCompat seperti yang dikatakan @Saran. Anda harus menelepon requestFeaturesebelumnyasuper.onCreate()
Jaison Brooks
7
Jawaban ini tidak banyak membantu ... tapi apa yang saya tahu
Ojonugwa Jude Ochalifu
23

Saya tahu usianya sudah lebih dari satu tahun, tetapi menelepon requestFeature()tidak pernah menyelesaikan masalah saya. Sebenarnya saya tidak menyebutnya sama sekali.

Kurasa itu masalah dengan memperbesar pandangan. Terlepas dari semua pencarian saya, saya tidak pernah menemukan solusi yang cocok sampai saya bermain-main dengan berbagai metode untuk meluaskan pandangan.

AlertDialog.Builder adalah solusi yang mudah tetapi membutuhkan banyak pekerjaan jika Anda menggunakan onPrepareDialog() untuk memperbarui tampilan itu.

Alternatif lain adalah memanfaatkan AsyncTask untuk dialog.

Solusi terakhir yang saya gunakan adalah di bawah ini:

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() );
       // ...
   }
}

* Beberapa catatan tambahan:

  1. Jangan mengandalkan menyembunyikan judul. Seringkali terdapat ruang kosong meskipun judul tidak disetel.
  2. Jangan mencoba membuat Tampilan Anda sendiri dengan footer header dan tampilan tengah. Tajuk, seperti yang disebutkan di atas, mungkin tidak sepenuhnya tersembunyi meskipun meminta FEATURE_NO_TITLE.
  3. Jangan terlalu mengatur tampilan konten Anda dengan atribut warna atau ukuran teks. Biarkan dialog menanganinya, jika tidak, Anda berisiko meletakkan teks hitam pada dialog biru tua karena vendor membalikkan warnanya.
Cookster
sumber
Awalnya saya memposting setTitle () dan setIcon () dalam metode onCreate (), tetapi hasil edit memindahkannya ke metode prepared () yang dipanggil selama metode onPrepareDialog ().
Cookster
2
Terima kasih telah berbagi. Saya pikir baris berikut content = inflater.inflate(R.layout.custom_view, null);mungkin harus content = li.inflate(R.layout.custom_view, null);. Jadi, inflaterharus diganti li.
aLearner
14

Saya sedang memperluas DialogFragment dan jawaban di atas tidak berhasil. Saya harus menggunakan getDialog () untuk menghapus judul:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
Argumen Ilegal
sumber
@ojonugwaochalifu itu beberapa waktu yang lalu jadi saya tidak ingat persis tapi saya yakin itu perlu dilakukan sebelum metode setcontentView ()
Argumen Ilegal
1
untuk siapa pun yang menghadapi masalah yang sama: Saya menambahkan kode ini di onViewCreated ();
7geeky
2

Bukankah kesalahan tersebut memberi tahu Anda apa yang salah? Anda menelepon requestWindowFeaturedan setFeatureIntsetelah Anda menelepon setContentView.

Ngomong-ngomong, kenapa kamu menelepon setContentViewdua kali?

EboMike
sumber
2

Untuk SDK versi 23 dan yang lebih baru, RuntimeException yang sama muncul jika Anda menggunakan AppCompatActivity untuk memperluas aktivitas Anda. Ini tidak akan terjadi jika aktivitas Anda berasal langsung dari Aktivitas.

Ini adalah masalah umum di google seperti yang disebutkan di https://code.google.com/p/android/issues/detail?id=186440

Solusi yang disediakan untuk ini adalah dengan menggunakan metode supportRequestWindowFeature () daripada menggunakan requestFeature ().

Harap beri suara positif jika itu menyelesaikan masalah Anda.

Keshav Bansal
sumber
1

Mengubah versi Kompilasi SDK , versi Sasaran SDK untuk versi Build Alat untuk 24.0.0 di build.gradle jika u menghadapi masalah dalam permintaan Fitur

Jaichander
sumber
0

Dalam kasus saya saya menunjukkan DialogFragmentdi Activity. Dalam fragmen dialog ini saya menulis seperti di DialogFragment menghapus batas hitam :

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
}

Entah menghapus setStyle(STYLE_NO_FRAME, 0)di onCreate()atau Chande / remove onCreateDialog. Karena pengaturan dialog telah berubah setelah dialog dibuat.

CoolMind
sumber
0

Saya mengalami masalah ini dengan Dialog berdasarkan DialogFragment yang diperpanjang yang bekerja dengan baik pada perangkat yang menjalankan API 26 tetapi gagal dengan API 23. Strategi di atas tidak berhasil tetapi saya menyelesaikan masalah dengan menghapus metode onCreateView (yang telah ditambahkan oleh template Android Studio terbaru) dari DialogFragment dan membuat dialog di onCreateDialog.

BillC
sumber