【问题标题】:ActionBarCompat: How to hide/ remove the 'title' of the 'underlying' activity?ActionBarCompat:如何隐藏/删除“基础”活动的“标题”?
【发布时间】:2014-03-16 08:23:51
【问题描述】:

我正在使用附加到 1 个基础活动的 ActionBarCompat。并且有许多片段可以使用导航抽屉进行导航。

每个片段都有一个以编程方式设置的相应标题。

像官方 Gmail 应用这样的应用有一个干净的启动器活动,即您在短时间内看到的第一个屏幕没有图标,操作栏中没有标题。我怎样才能达到同样的效果?

在使用以下片段加载应用后,ActionBar 已通过编程方式使用相应的标题和图标进行了适当的样式设置,如前所述。

我已尝试将以下代码放入 style.xml 并从清单中调用它。但是这个在整个应用程序中禁用的操作栏,我不想要。:

      <style name="Theme.AppCompat.Light.NoActionBar" parent="@style/Theme.AppCompat">

          <item name="android:windowNoTitle">true</item>

      </style>

【问题讨论】:

  • 你是否使用 'true' 作为 Activity 的样式?
  • 是的,我尝试在活动的 style.xml 下设置它。如果我这样做,应用程序会在启动时崩溃。

标签: android android-fragments android-xml android-actionbar-compat


【解决方案1】:

只需将setTitle(""); 添加到您的活动 oncreate。

【讨论】:

  • 这不适用于最初显示一秒钟的活动。
  • 你是在setContent之前还是之后做setTitle?
【解决方案2】:

我认为您可以像这样创建自己的 ActionBar 布局:

在你的 BaseActivity(你有一个,对吗?)做这样的事情:

public class BaseActivity extends ActionBarActivity  {
    private TextView mActionBarTextView;    
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final android.support.v7.app.ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
            actionBar.setDisplayShowCustomEnabled(true);
            actionBar.setDisplayShowTitleEnabled(false);
            LayoutInflater inflator = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            final View actionBarView = inflator.inflate(R.layout.ab_custom_view, null);
            mActionBarTextView = (TextView) actionBarView.findViewById(R.id.title);
            mActionBarTextView.requestFocus();
            this.getSupportActionBar().setCustomView(actionBarView);
            setTitle(Constants.EMPTY_STRING); 
    }
}

ab_custom_view.xml 看起来像(设置您自己的 TextView 首选项,这只是一个未经测试的示例):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@android:color/transparent">
  <TextView
      android:id="@+id/title"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerVertical="true"
      android:layout_marginLeft="5dp"
      android:textColor="@color/white"
      android:textSize="18sp"
      android:maxLines="1"
      android:ellipsize="marquee"
      android:focusable="true"
      android:singleLine="true"
      android:focusableInTouchMode="true" />
</RelativeLayout>

回到您的BaseActivity,添加以下便捷方法:

@Override
public void setTitle(final CharSequence title) {
    if (mActionBarTextView != null) {
        if (title != null) {
            mActionBarTextView.setText(title);
        } else {
            mActionBarTextView.setText(null);
        }
        requestTitleFocus();
    }
}
@Override
public void setTitle(final int titleId) {
    if (mActionBarTextView != null) {
        if (titleId > 0) {
            mActionBarTextView.setText(getString(titleId));
        } else {
            mActionBarTextView.setText(getString(R.string.some_default_string);
        }
        requestTitleFocus();
    }
}
public void requestTitleFocus() {
    if (mActionBarTextView != null) {
        mActionBarTextView.requestFocus();
    }
}

最后,在您的活动(继承自 BaseActivity)中,如果您需要设置一个不同于空的标题:

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle("Your Title");
}

(为了方便和高效,我假设您将最常用的字符串存储在静态 final 字段中……)

public final class Constants {
    public static final String EMPTY_STRING = "";
}   

这应该可以解决问题。

您获得的好处是您可以在 ActionBar 中使用自定义字体(如果您使用自定义字体,以匹配您的应用程序的字体),因为您可以完全控制(和引用)您的 ActionBar 的文本视图。 ;)

【讨论】:

  • 谢谢@Martín,我会试试这个并告诉你。好吧,我有 1 个基本活动,其余的是通过导航抽屉访问的片段。所以如果我必须设置通过抽屉加载的每个片段的标题,我需要把 setTitle("Your Title");在每个片段的 onCreateView() 内?
  • 没错,您必须创建一个接口或强制转换为 Activity 并使用 setTitle(); ;)
【解决方案3】:

尝试在清单文件中为您的活动使用样式。请记住,在您的 onCreate() 方法中,当您想要恢复操作栏或应用样式时,您必须在 setContentView() 之前调用 setStyle() 或 requestWindowFeature()。

    <style name="MyApp.Fullscreen" parent="android:Theme.Black.NoTitleBar">
    <item name="android:windowBackground">@color/app_background</item>
</style>

【讨论】:

  • 谢谢@Michal 我尝试了一个类似的代码来使其与 AppCompat 兼容。看看更新的帖子。但是,这完全禁用了整个应用程序的操作栏。我只是想在启动期间隐藏显示应用程序名称的操作栏的“标题”。
  • 哦,我明白了,我认为从 titleTextStyle 继承应该可以工作,检查developer.android.com/guide/topics/ui/actionbar.html“一般外观”。不过我没有测试它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2012-08-31
  • 2011-08-21
相关资源
最近更新 更多