Как скрыть панель действий на HTC one с помощью темы Holo.NoActionBar

В моем приложении используется тема Holo.NoActionBar для Android, чтобы скрыть панель действий и отобразить активность.

Это отлично работает на эмуляторе, и мой Nexus 4, панель действий устройства скрыта.

однако, когда он запускается на HTC one, он игнорирует настройки темы Android и отображает панель действий. Он также может отображаться на некоторых других устройствах Samsung или Sony, которые имеют пользовательские скины OEM. Я убедился, что в java-файле активности или файле манифеста Android нет ссылок на панель действий или параметры меню.

Итак, я погуглил, как скрыть панель действий, и попробовал это Как скрыть панель действий перед созданием активности, а затем показать ее снова?

и написал код

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getActionBar().hide();
setContentView(R.layout.activity_my);

и http://developer.android.com/guide/topics/ui/actionbar.html

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
setContentView(R.layout.activity_my);

Однако в обоих случаях среда IDE отображает предупреждение о том, что вызов метода «actionBar.hide()» может привести к возникновению «java.lang.NullPointerException».

«Эта проверка анализирует управление методом и поток данных, чтобы сообщить о возможных условиях, которые всегда истинны или ложны, о выражениях, значение которых статически подтверждено как постоянное, и о ситуациях, которые могут привести к нарушению контракта с нулевым значением».

Хотя я новичок в разработке Android, я знаю, что NullPointerException не следует игнорировать.

Но в этом действии важно скрыть панель действий.

Как мне изменить этот код, чтобы он не был подвержен ошибкам??

ОБНОВЛЕНИЕ: и почему Holo.NoActionBar не работает с HTC one. Он по-прежнему отображает панель действий, при установке того же apk панель действий не отображается на Nexus 4.

Манифест Android:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.xxxxxxxx.xxxxxxxxx" >

<uses-permission android:name="android.permission.VIBRATE" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MyActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    .
    .
    lots of non-relevant activities
    .
    .

    <activity
        android:name=".Setting"
        android:label="@string/title_activity_setting"
        android:parentActivityName=".MyActivity"
        android:screenOrientation="portrait">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.xxxxxxxxx.xxxxxxxxxx.MyActivity" />
    </activity>
    <activity
        android:name=".t1"
        android:screenOrientation="portrait"
    >
    </activity>
    <activity
        android:name=".t2"
        android:screenOrientation="portrait"
    >
    </activity>
    <activity
        android:name=".t3"
        android:screenOrientation="portrait"
        >
    </activity>
    <activity
        android:name=".t4"
        android:screenOrientation="portrait"
         >
    </activity>
    <activity
        android:name=".t5"
        android:label="@string/title_activity_t5"
        android:screenOrientation="portrait"
        android:parentActivityName=".MyActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.xxxxxxxxxx.xxxxxxxxxx.MyActivity" />
    </activity>
</application>

</manifest>

t1.java, без Actionbar.hide()

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;


public class t1 extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_t1);

    RelativeLayout rl = (RelativeLayout) findViewById(R.id.rel1);
    rl.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent newactivity= new Intent(getApplicationContext(), t2.class);
            startActivity(newactivity);
        }
    });
}


}

и t2,t3,t4,t5 имеют аналогичный код

файл макета:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.xxxxxxxxxx.xxxxxxxx.t1"
android:background="@drawable/finalp2"
android:id="@+id/rel1">

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView"
    android:layout_marginTop="40dp"
    android:background="@drawable/bat"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginLeft="40dp" />

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageViewbottom"
    android:background="@drawable/bat"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_marginRight="40dp"
    android:layout_marginBottom="42dp" />

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView2"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:background="@android:drawable/ic_media_pause" />

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView4"
    android:layout_below="@+id/imageView"
    android:layout_toRightOf="@+id/imageView"
    android:layout_toEndOf="@+id/imageView"
    android:layout_marginTop="112dp"
    android:background="@drawable/ball1" />


</RelativeLayout>

Как я выбрал тему: http://s16.postimg.org/6vuyjhwth/noactionbar.png< /а>

Я не создал никакого другого файла style.xml, я что-то пропустил?? Если я что-то пропустил, как он нормально работает на nexus 4 и почему он отображается без панели действий в IDE?

В моем приложении используется SDK версии 15 и выше.


person Akshit Rewari    schedule 17.08.2014    source источник
comment
Вероятно, вам следует сначала задать вопрос, чтобы выяснить, почему ваша тема не работает должным образом (и работает для многих других разработчиков).   -  person ianhanniballake    schedule 18.08.2014
comment
@ianhanniballake: тема работает на устройствах Nexus и эмуляторе. Проблема, с которой я столкнулся, связана с HTC, вероятно, из-за некоторых пользовательских скинов.   -  person Akshit Rewari    schedule 18.08.2014
comment
Да, это то, что вы сказали. Вы должны сначала решить эту проблему, а не пытаться с ней справиться. Очевидно, что это работает для тысяч других разработчиков, поэтому мы хотели бы выяснить, что не так в вашем случае.   -  person ianhanniballake    schedule 18.08.2014
comment
Прежде чем мы сможем выяснить, что не так, вы захотите включить кучу фактического кода, который вы написали, в частности, ваш AndroidManifest.xml, ваши стили и класс, который расширяет ваша активность.   -  person ianhanniballake    schedule 18.08.2014
comment
Пожалуйста, напишите, где определяется @style/AppTheme   -  person ianhanniballake    schedule 18.08.2014
comment
в коде файла style.xml указано ‹style name=AppTheme parent=android:Theme.Holo.Light.DarkActionBar›, который используется в большинстве действий, однако в этих 5 действиях, где мне нужно скрыть панель действий, я заменил AppTheme на Holo.NoActionBar. Пожалуйста, проверьте ссылку на изображение, которую я включил в вопрос, чтобы показать, где я это делаю.   -  person Akshit Rewari    schedule 18.08.2014


Ответы (2)


К вашей активности t1 не применяется какая-либо тема в AndroidManifest.xml, поэтому она использует тему по умолчанию для вашего приложения — в вашем случае @style/AppTheme, которая включает панель действий. Установите тему в своем манифесте:

<activity
    android:name=".t1"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Holo.Light.NoActionBar"
>
</activity>

Или создайте новую тему специально для случая без панели действий:

<style name="AppTheme.NoActionBar" parent="android:Theme.Holo.Light.NoActionBar">
    <!-- Customize your theme here. -->
</style>

И используйте его:

<activity
    android:name=".t1"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme.NoActionBar"
>
</activity>
person ianhanniballake    schedule 17.08.2014
comment
Спасибо большое за вашу помощь. Я нашел то, что упустил, когда вы спросили о стилях.xml в комментариях, я изменил свой код, и теперь он работает. - person Akshit Rewari; 18.08.2014
comment
Однако просто из любопытства, если к действию t1 не применяется какая-либо тема в AndroidManifest.xml, поэтому он использует @style/AppTheme по умолчанию, который включает панель действий, и я не выбрал тему панели действий в параметрах дизайна layout_t1.xml, но не обновлял манифест, почему есть разница в поведении приложения на nexus 4 и HTC one - person Akshit Rewari; 18.08.2014

Мне удалось решить проблему (благодаря помощи, предоставленной ianhanniballake, большое спасибо).

Измененный файл стилей.xml

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <!-- Customize your theme here. -->
</style>

<style name="newTheme" parent="android:Theme.Holo.NoActionBar">
    <!-- Customize your theme here. -->
</style>

</resources>

и измененный манифест Android

<activity
    android:name=".t1"
    android:screenOrientation="portrait"
    android:theme="newtheme"
>
</activity>
<activity
    android:name=".t2"
    android:screenOrientation="portrait"
            android:theme="newtheme"

>
</activity>
<activity
    android:name=".t3"
    android:screenOrientation="portrait"
    android:theme="newtheme"

    >
</activity>
<activity
    android:name=".t4"
    android:screenOrientation="portrait"
    android:theme="newtheme"

     >
</activity>

Код теперь отлично работает на HTC one и NEXUS. Большое спасибо, ianhanniballake.

person Akshit Rewari    schedule 17.08.2014
comment
Убедитесь, что вы используете Holo.Light.NoActionBar вместо Holo.NoActionBar, иначе другое форматирование (например, цвет текста, диалоги и т. д.) будет отличаться от других ваших действий, если только это не то, что вам нужно. - person ianhanniballake; 18.08.2014