Ответ 1
Может использовать getSupportActionBar()
вместо метода getActionBar()
.
У меня странная проблема. Я делаю приложение с targetdk 13.
В моей основной деятельности onCreate метод я вызываю getActionBar()
для настройки моей панели действий. Это отлично работает при работе на эмуляторе Android 3.2, но при использовании Android 3.0 и 3.1 метод getActionBar()
возвращает значение null.
Я нахожу это чрезвычайно странным, и я не вижу причин, почему он это сделает. Это ошибка с эмуляторами или есть что-то, что мне нужно сделать, чтобы убедиться, что у моего приложения есть панель действий?
РЕШЕНИЕ:
Думаю, я нашел решение этой проблемы.
Я не использовал setContentView для установки макета для этой активности. Вместо этого я использовал fragmentTransaction.add(android.R.id.content, mFragment, mTag)
для добавления фрагмента в действие.
Это отлично работало в 3.2, но в более ранних версиях сотовой панели панель действия, по-видимому, не установлена, если вы не используете setContentView в методе onCreate()
.
Поэтому я исправил его с помощью метода setContentView()
в моем методе onCreate()
и просто предоставил ему макет, содержащий пустой файл FrameLayout.
Я все еще могу использовать метод fragmentTransaction.add(android.R.id.content, mFragment, mTag)
так же, как и раньше.
Это не самое красивое исправление, но оно работает.
Может использовать getSupportActionBar()
вместо метода getActionBar()
.
import android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity {
getSupportActionBar()
вместо getActionBar()
import android.support.v7.app.ActionBarActivity;
Я рекомендую использовать:
import android.support.v7.app.AppCompatActivity
Вы должны определить тип окна как панель действий перед тем, как действие отобразит его представление.
использовать
requestWindowFeature(Window.FEATURE_ACTION_BAR);
перед вызовом метода setContentView().
если вы используете android.support.v7.app.AppCompatActivity
открытый класс HomeActivity расширяет AppCompatActivity {
Затем вы должны использовать android.support.v7.app.ActionBar
ActionBar ab = getSupportActionBar();
Если вы используете android.support.v4.app.FragmentActivity
Открытый класс HomeActivity расширяет FragmentActivity {
тогда вы должны использовать android.app.ActionBar
ActionBar ab = getActionBar();
Если вы используете android.support.v7.app.ActionBarActivity
открытый класс HomeActivity расширяет ActionBarActivity {
вы должны использовать android.support.v7.app.ActionBar
ActionBar ab = getSupportActionBar();
Я столкнулся с вышеупомянутой проблемой, когда метод getActionBar()
возвращает значение null. Я вызывал getActionBar()
после установки setContentView()
и все еще возвращал null
.
Я решил проблему, установив версию min-sdk в файле манифеста Android, которая была изначально отсутствующей.
<uses-sdk android:minSdkVersion="11" />
ActionBar нуждается в приложении или мероприятии Тема для названия приложения. Убедитесь, что вы не указали свое приложение или активность как Theme.NOTITLE.
<application
android:name="com.xxx.yyy"
android:debuggable="false"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/Theme.NoTitle"> // remove this line if you have this in your code
<activity
android:name="com.xxx.yyy.Activity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.NoTitle" // remove this line if you have in your code
android:windowSoftInputMode="adjustResize|stateHidden" >
import android.support.v7.app.AppCompatActivity;
затем
extends AppCompatActivity
затем используйте
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Этот ответ опаздывает, но может быть полезен для всех, кто приходит из Google: вам может потребоваться объявить
<item name="android:windowActionBar">true</item>
в styles.xml
. Кажется, что false
может быть значением по умолчанию. Вы также должны быть на API 11 или выше.
Более подробную информацию можно найти в документации здесь. В частности, цитата:
Совет. Если у вас есть пользовательская тема, в которой вы хотите удалить панели действий, установите для свойства стиля android: windowActionBar значение ложный. Однако, если вы удалите панель действий с помощью темы, окно не позволит панели действий вообще, поэтому вы не можете добавить ее более поздний вызов getActionBar() возвращает null.
У меня была та же проблема, и одним из решений было использование setContentView()
перед вызовом getActionBar()
.
Но было другое, что устранило проблему. Я задал тему для приложения @android:style/Theme.Holo.Light
.
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.Light" >
...
</application>
Я думаю, что любая тема, в которой есть <item name="android:windowActionBar">true</item>
, может быть использована.
Основная причина этого - использование тем, которые не поддерживают ActionBar:
В файле манифеста добавьте следующее в свой целевой объект или элемент приложения (если вы хотите объединить тему над всем приложением)
Примеры тем, поддерживающих панель действий "Theme.AppCompat.Light"
или "Theme.Holo.Light"
...
android:theme="@android:style/Theme.Holo.Light"
Лучше поместить все стили в styles.xml
и использовать его везде, используя "@style/themName"
, чтобы предыдущий был
android:theme="@style/AppTheme"
и styles.xml будут иметь следующее:
<style name="AppTheme" parent="Theme.AppCompat.Light">
Советы:
"@android:style/Theme.Holo.Light.DarkActionBar"
не поддерживается до SDK версии 14.Чтобы ваше приложение поддерживало минимальную версию SDK, вы можете добавить следующее в элемент <app>
:
<uses-sdk android:minSdkVersion="14" />
Чтобы указать минимальную версию SDK в AndroidStudio, вы можете использовать файл app Gradle.
android{
defaultConfig{
minSdkVersion 14
targetSdkVersion 21
}
}
Я столкнулся с этой проблемой. Я проверял номер версии и включал панель действий, только если она больше или равна Honeycomb, но она возвращала значение null. Я нашел причину и основной причиной было то, что я отключил стиль темы Holo в style.xml в папке значений-v11.
перейдите в AndroidManifest.xml и замените
Android: тема = "@стиль/AppTheme"
by
android: theme = "@android: style/Theme.Holo.Light.DarkActionBar"
Используйте getSupportActionBar() вместо getActionBar()
В моем случае у меня было это в моем коде, который не работал:
@Override
protected void onCreate(Bundle savedInstanceState) {
context = getApplicationContext();
requestWindowFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
Затем я играл с порядком кода:
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = getApplicationContext();
}
И это сработало!
Заключение: requestWindowFeature должен быть первым, что вы вызываете в методе onCreate.
У меня была такая же проблема. Он решен путем chaning темы приложения в styles.xml
Перед
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
После
<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
Одна вещь, которую я хотел добавить, так как я просто столкнулся с этим, если вы пытаетесь getActionBar() для Activity, у которого есть родительский элемент, он возвращает null. Я пытаюсь реорганизовать код, где моя активность содержится внутри ActivityGroup, и мне потребовалось несколько минут для того, чтобы я пошел "oh duh", посмотрев на источник создания ActionBar в источнике.
Я решаю это с помощью этих изменений:
android:theme="@android:style/Theme.Holo.Light" >
extends ActionBarActivity
import android.support.v7.app.ActionBarActivity
Я знаю, что опаздываю на вечеринку (и новичок в Android) по этому вопросу, но я нашел здесь полезную информацию и подумал, что должен добавить результаты моих собственных усилий, чтобы заставить ActionBar работать так, как я хотел, в случае, если другие как я прихожу искать помощь.
У меня есть виджет, который является плавающим окном без заголовка окна. Я использую тему стиля для реализации android:windowIsFloating
, android:backgroundDimEnabled
и android:windowNoTitle
. Виджет работал нормально, пока я не захотел добавить кнопку, назвавшую пэджер фрагмента несколькими страницами фрагментов списка, и использовал ActionBar. Это приведет к сбою в активности пейджера с исключением с нулевым указателем. Я сузил его, чтобы ActionBar был пустым. По результатам предыдущих людей, которые внесли свой вклад в этот поток, я удалил свою тему из файла манифеста, и ActionBar работал нормально, но теперь мое окно теперь больше плавает (оно было полноэкранным), и у него был заголовок страницы, который мне не нужен.
Дальнейшие исследования привели меня в Руководство по учебным пособиям по стилям и темам, которые привели меня к решению. Я обнаружил, что могу добавить свою собственную тему к отдельным действиям в файле манифеста, тогда как до того, как я применил ее к приложению. Все мои окна теперь имеют желаемый внешний вид.
Попробуйте расширить класс Activity из ActionBarActivity. Это решило это для меня. Сделайте что-то вроде следующего:
public class MyActivity extends ActionBarActivity
{
. . .
В моем случае класс расширялся только из Activity.
Это также может помочь некоторым людям.
В моем случае это произошло потому, что я не определил контекст в menu.xml
Попробуйте следующее:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.android.ActionBarActivity">
Вместо этого:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
Просто проверьте реализацию исходного кода командой:
private void initWindowDecorActionBar() {
Window window = getWindow();
// Initializing the window decor can change window feature flags.
// Make sure that we have the correct set before performing the test below.
window.getDecorView();
if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
return;
}
mActionBar = new WindowDecorActionBar(this);
mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
mWindow.setDefaultIcon(mActivityInfo.getIconResource());
mWindow.setDefaultLogo(mActivityInfo.getLogoResource());
}
requestWindowFeature (Window.FEATURE_ACTION_BAR); Исправлена проблема, когда я видел, что requestWindowFeature (Window.FEATURE_ACTION_BAR) не работает; код используется с открытым исходным кодом!
Чтобы добавить к другим ответам:
Убедитесь, что вы вызываете setActionBar()
или setSupportActionBar()
в свой onCreate()
перед вызовом getActionBar()
:
Определите панель инструментов в вашем файле activity.xml, затем в onCreate():
Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
// Now you can use the get methods:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
android.support.v7.app.ActionBar actionBar = getSupportActionBar();
работает довольно быстро
В моем случае мне просто пришлось расширить AppCompatActivity
вместо Activity
supportActionBar?.setDisplayHomeAsUpEnabled(true)
Полный пример занятий:
импорт android.os. импорт импорта androidx.appcompat.app.AppCompatActivity
//class LocationFound : Activity() { <-----Does not seem to work with ActionBar in recent versions
class LocationFound : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_location_found)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
} }
На версиях
minSdkVersion 22
targetSdkVersion 29