【问题标题】:Use stylized action bar in every activity在每个活动中使用风格化的操作栏
【发布时间】:2018-08-17 10:32:06
【问题描述】:

我想在操作栏中为我的应用名称使用自定义颜色、字体和大小,所以我进入 MainActivity.java 并像这样对其进行样式化

    //stylize the action bar
    TextView tv = new TextView(getApplicationContext());
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT);
    tv.setLayoutParams(lp);
    tv.setText(R.string.Title);
    tv.setTextSize(45);
    tv.setTextColor(Color.parseColor("#FFFFFF"));
    Typeface tf = Typeface.createFromAsset(getAssets(), "KGALittleSwag.ttf");
    tv.setTypeface(tf);
    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    getSupportActionBar().setCustomView(tv);
    updateOptionsMenu();

这成功了,然后当我添加另一个活动时,我将这段代码复制到其中,它看起来很棒。此时,我的应用程序几乎可以发布了,但我正在进行一些重构,现在我有 6 个左右的活动,将这段代码放入每个活动中感觉有点多余。将这些更改普遍应用于操作栏是否有更好的做法?

【问题讨论】:

    标签: java android android-actionbar material-design


    【解决方案1】:

    这就是inheritance 的用途。

    创建一个abstract BaseActivity 类,您将在其中进行所有这些处理。您要应用这些样式的所有活动都将继承为BaseActivity

    public abstract class BaseActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate (Bundle savedInstanceState) {
             super.onCreate (savedInstanceState);
    
             //stylize the action bar
             TextView tv = new TextView(getApplicationContext());
             RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams (ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT);
             tv.setLayoutParams(lp);
             tv.setText(R.string.Title);
             tv.setTextSize(45);
             tv.setTextColor(Color.parseColor("#FFFFFF"));
             Typeface tf = Typeface.createFromAsset(getAssets(), "KGALittleSwag.ttf");
             tv.setTypeface(tf);
    
             getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
             getSupportActionBar().setCustomView(tv);
             updateOptionsMenu();
    
        }
    }
    

    然后你的孩子活动:

    public abstract class ChildActivity extends BaseActivity {
    
        @Override
        protected void onCreate (Bundle savedInstanceState) {
            super.onCreate (savedInstanceState); // Here it calls the parent onCreate method and therefore executes the styling code
        }
    }
    

    【讨论】:

    • 这对我来说似乎是个好方法,谢谢!但是有一个问题,我是在我的文件夹中与所有其他类一起创建 BaseActivity 类,还是有另一种方法使其抽象?
    • @PaxanaNonGrata 您可以在 activities 包的根目录上创建一个常规 Java 类(假设您有一个)。您可以像对待任何 Java 类一样对待它,唯一的区别是它是抽象的并且没有 XML 布局。
    【解决方案2】:

    您可以做的只是为您的自定义操作栏创建一个XML 布局文件,然后在所有活动中使用它。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/actionBarTxt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_gravity="center"
            android:gravity="center"
            android:maxLines="1"
            android:text="your text"
            android:textAlignment="center"
            android:textColor="#ffffff"
            android:textSize="20dp"
            android:textStyle="bold" />
    </RelativeLayout>
    

    确保您的TextView 居中,并且您的TextViewlayout_widthlayout_hight 设置为wrap_content

    将其放入您要使用自定义操作栏的每个活动中

    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    getSupportActionBar().setCustomView(R.layout.custom_action_bar);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多