【问题标题】:Hide Action Bar in a Fragment Activity在片段活动中隐藏操作栏
【发布时间】:2013-11-22 01:30:04
【问题描述】:

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

我可以很好地隐藏我的活动的操作栏,但每次我运行应用程序时,我都会看到我膨胀的空白片段和默认操作栏大约 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>

【问题讨论】:

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


    【解决方案1】:

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

    Android 清单:

    <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 中的标题栏,当我将该样式应用于活动本身时(我认为是使用动态主题的唯一方法)它似乎根本不起作用。

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

    【讨论】:

      【解决方案2】:

      试试这个:

      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();
      }
      

      【讨论】:

      • 谢谢老兄,但我想我已经用我的其他答案解决了这个问题,如果你注意到这是我最初使用的,但是基础片段容器在 super.onCreate() 方法中被抛出在屏幕上首先几秒钟
      【解决方案3】:

      Daniel Wilson 的上述评论确实有效,但与我的做法略有不同。 我根本没有定义样式,我在 AndroidManifext.xml 中所做的只是将它添加到我的活动中:

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

      所以,我不必为 NoActionBar 重新定义样式,我只是从 Theme.AppCompat 中添加的

      【讨论】:

      • 是的,我相信与首次发布此问题时相比,这是对应用程序兼容性库的一个相对较新的补充,尽管我可能是错的!似乎是一个很好的解决方案
      【解决方案4】:

      我在 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);
          // ...
      }
      

      【讨论】:

        猜你喜欢
        • 2016-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多