代码之家  ›  专栏  ›  技术社区  ›  Akshit Rewari

如何使用Holo.NoActionBar主题在HTC one上隐藏动作栏

  •  0
  • Akshit Rewari  · 技术社区  · 12 年前

    我的应用程序使用android them Holo.NoActionBar主题来隐藏动作栏并显示活动。

    这在模拟器和我的Nexus 4上运行良好,设备操作栏隐藏。

    然而,当它在HTC one上运行时,它会忽略android主题设置并显示操作栏。它也可能显示在一些其他三星或索尼设备上,这些设备具有定制的OEM皮肤。我已经确保在活动java文件或android清单文件中没有对操作栏或菜单选项的引用。

    所以我在谷歌上搜索了如何隐藏动作栏并尝试了这个 How to hide action bar before activity is created, and then show it again?

    并编写了代码

    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及更高版本

    2 回复  |  直到 9 年前
        1
  •  1
  •   ianhanniballake    12 年前

    您的活动 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>
    
        2
  •  0
  •   Akshit Rewari    12 年前

    我能够解决这个问题(感谢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