Próbuję zaimplementować niestandardowy pasek tytułu:
Oto moja klasa pomocnicza:
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);
}
}
}
Oto miejsce, w którym nazywam to w onCreate ():
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupUI();
}
private void setupUI(){
setContentView(R.layout.main);
UIHelper.setupTitleBar(this);
}
Ale pojawia się błąd:
requestFeature() must be called before adding content
android
android-layout
android-activity
Sheehan Alam
źródło
źródło
Odpowiedzi:
Po prostu zrób to, co mówi komunikat o błędzie.
Nie dzwoń
setContentView()
wcześniejrequestFeature()
.Uwaga:
Jak wspomniano w komentarzach, zarówno w przypadku biblioteki, jak
ActionBarSherlock
iAppCompat
biblioteki, należyrequestFeature()
wcześniej zadzwonićsuper.onCreate()
źródło
requestFeature()
przedsuper.onCreate()
. ŹródłarequestWindowFeature(Window.FEATURE_NO_TITLE)
aby go ukryć, a następniesetContentView()
dla pierwszego układu, a następnierequestWindowFeature(Window.FEATURE_CUSTOM_TITLE)
ponownie wyświetlić pasek tytułu. To będzie posetContentView()
raz drugi.requestFeature
wcześniejsuper.onCreate()
Wiem, że ma ponad rok, ale telefon
requestFeature()
nigdy nie rozwiązał mojego problemu. W rzeczywistości wcale tego nie nazywam.Przypuszczam, że był to problem z zawyżeniem widoku. Pomimo wszystkich moich poszukiwań, nigdy nie znalazłem odpowiedniego rozwiązania, dopóki nie bawiłem się różnymi metodami powiększania widoku.
AlertDialog.Builder to łatwe rozwiązanie, ale wymaga dużo pracy, jeśli używasz
onPrepareDialog()
do aktualizacji tego widoku.Inną alternatywą jest wykorzystanie AsyncTask do dialogów.
Ostateczne rozwiązanie, które zastosowałem, jest poniżej:
* Kilka dodatkowych uwag:
źródło
content = inflater.inflate(R.layout.custom_view, null);
prawdopodobnie powiniencontent = li.inflate(R.layout.custom_view, null);
. Więcinflater
musi zostać zastąpiony przezli
.Rozszerzałem DialogFragment i powyższa odpowiedź nie działa. Musiałem użyć getDialog (), aby usunąć tytuł:
źródło
Czy błąd nie mówi dokładnie, co jest nie tak? Dzwonisz
requestWindowFeature
isetFeatureInt
po tym, jak dzwoniszsetContentView
.Swoją drogą, dlaczego dzwonisz
setContentView
dwa razy?źródło
W przypadku zestawu SDK w wersji 23 i nowszych ten sam RuntimeException jest generowany, jeśli używasz AppCompatActivity do rozszerzenia aktywności. Nie stanie się tak, jeśli Twoja aktywność wywodzi się bezpośrednio z Aktywności.
Jest to znany problem w Google, o którym mowa w https://code.google.com/p/android/issues/detail?id=186440
Rozwiązaniem przewidzianym w tym celu jest użycie metody supportRequestWindowFeature () zamiast requestFeature ().
Proszę zagłosuj za, jeśli to rozwiąże twój problem.
źródło
Zmień wersję kompilacji SDK , wersja docelowa SDK do wersji kompilacji Narzędzia do 24.0.0 w build.gradle jeśli u obliczu problemu w Zgłoszenie błędu
źródło
W moim przypadku pokazałem
DialogFragment
wActivity
. W tym fragmencie okna dialogowego napisałem jak w DialogFragment usuń czarne obramowanie :Albo usunąć
setStyle(STYLE_NO_FRAME, 0)
sięonCreate()
lub chande / usuńonCreateDialog
. Ponieważ ustawienia okna dialogowego uległy zmianie po jego utworzeniu.źródło
Miałem ten problem z Dialogami opartymi na rozszerzonym DialogFragment, który działał dobrze na urządzeniach z API 26, ale zawiódł z API 23. Powyższe strategie nie działały, ale rozwiązałem problem, usuwając metodę onCreateView (która została dodana przez bardziej ostatni szablon Android Studio) z DialogFragment i tworzenie okna dialogowego w onCreateDialog.
źródło