在片段活动中隐藏操作栏

时间:2013-11-22 01:30:05

标签: android android-fragmentactivity android-actionbar-compat android-actionbaractivity

我正在为应用创建框架,并希望隐藏登录活动的操作栏。该应用程序将完全由片段组成,因为它们非常棒。

我可以隐藏操作栏以适应我的活动,但每次运行应用程序时,我都会看到我膨胀的空白片段和默认操作栏大约2秒钟,然后才能设置充气登录片段。

关于我应该如何/在哪里隐藏动作栏,(同时保持我的框架)阻止这种情况发生的任何想法?

LoginActivity.java

public class LoginActivity extends SingleFragmentActivity {
@Override
protected Fragment createFragment() {
    return new LoginFragment();
}

}

SingleFragmentActivity.java

public abstract class SingleFragmentActivity extends ActionBarActivity {
protected abstract Fragment createFragment();

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

    if(this instanceof LoginActivity){
        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();
    }
    setContentView(R.layout.activity_fragment);

    FragmentManager fm = getSupportFragmentManager();
    Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);

    if (fragment == null) {
        fragment = createFragment();
        fm.beginTransaction()
                .add(R.id.fragmentContainer, fragment)
                .commit();
    }
}

}

LoginFragment.java

public class LoginFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_login, parent, false);

    return v;
}

}

我最初使用SingleFragmentActivity扩展FragmentActivity并在if语句中执行此操作:

    requestWindowFeature(Window.FEATURE_NO_TITLE);

但我有一种感觉,这只是做同样事情的另一种方式

编辑:

我还尝试将fragment_activity设置为使用不同的样式,但它似乎也不起作用:

    <style name="NoActionBar" parent="Widget.AppCompat.ActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
</style>

4 个答案:

答案 0 :(得分:14)

好几个小时之后,我想我已找到解决方案,为所有内容保留片段,并仅删除启动活动的操作栏(适用于所有设备):

Android Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.app"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="19" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity
        android:name="com.company.app.LoginActivity"
        android:theme="@style/NoActionBar"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

样式的定义如下:

   <style name="NoActionBar" parent="Theme.AppCompat.Light">
    <item name="android:windowNoTitle">true</item>
</style>

由于没有Theme.AppCompat.Light.NoActionBar,操作栏基本上被称为旧API中的标题栏,当我将该样式应用于活动本身时(我认为它是使用动态主题的唯一方式)它似乎根本不起作用。

所以希望这个简单的解决方案能够保留任何其他活动的操作栏,并且可能会对未来的某个人有所帮助:)。

答案 1 :(得分:11)

试试这个:

if(this instanceof LoginActivity) {
    if (getActionBar().isShowing()) getActionBar().hide();
} else {
    if (getActionBar().isShowing()) getActionBar().hide();
}

if(this instanceof LoginActivity){
    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();
} else {
    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();
}

答案 2 :(得分:3)

丹尼尔威尔逊上面的评论确实有效,但我的表现只是微不足道。 我根本没有定义样式,我在AndroidManifext.xml中所做的就是我将其添加到我的活动中:

android:theme="@style/Theme.AppCompat.NoActionBar"

所以,我没有为NoActionBar重新定义样式,我只是从Theme.AppCompat中添加了它

答案 3 :(得分:2)

我在Activity.onCreate()

中使用此代码
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Hiding the title bar has to happen before the view is created
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_main);
    // ...
}