如何給非AppCompatActivity添加Toolbar?--關於5.0新特性兼容5.0以下設備的探索


Android支持包22.1引進了AppCompatDelegate

最新22.1版本的支持包引入了大量酷炫的新特性,這些特性將允許我們輕易地將材料設計/API 21+的特性應用到之前的那些老的,不兼容的Activity上面。

我們知道,繼承AppCompatActivity是最容易實現的方式,但是有時候我們還是需要使用老辦法,對嗎?

你可以使用支持包提供了新的AppCompatDelegate構件,很容易地將Toolbar添加到Activity上。

 

1,將Toolbar控件添加到布局文件上面

 

ActionBar現在已經被不再被告維護了,它應該被Toolbar取代,因為后者允許了更多的UI靈活性,並且允許Activity更容易地兼容於材料設計的UI模式。

因為我們要在這使用支持包,那么我們將使用Toolbar的支持版本,不然的話,將只能在API  21+上可用。

xml中添加如下內容:

1 <android.support.v7.widget.Toolbar
2     android:id="@+id/my_awesome_toolbar"
3     android:layout_height="@dimen/abc_action_bar_
4 default_height_material"
5     android:layout_width="match_parent"
6     android:minHeight="@dimen/abc_action_bar_
7 default_height_material"
8     android:background="?attr/colorPrimary"
9     />
View Code

 

2,修改主題:

 

因為我們要將Toolbar嵌入到布局文件中,所以我們需要不支持ActionBar的主題。

所以,在確定在styles.xml文件中使用主題Theme.AppCompat.NoActionBar

特別推薦,要在你的主題上添加如下所示的材料設計色彩項,這將很容易地實現對Toolbar和狀態欄的着色(只有API 21+的設備上才會對狀態欄進行着色):

 1 <!-- Base application theme. -->
 2 <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
 3     <!-- colorPrimary is used for coloring the Toolbar -->
 4     <item name="colorPrimary">#3F51B5</item>
 5     <!-- colorPrimaryDark is used for coloring the status bar -->
 6     <item name="colorPrimaryDark">#303F9F</item>
 7     <!-- colorAccent is used as the default value for colorControlActivated
 8          which is used to tint widgets -->
 9     <item name="colorAccent">#FFAB40</item>
10 </style>
View Code

 

3,將AppCompatDelegate添加到Activity里面

 

AppCompatDelegate是一個委托代表,它將AppCompatActivity的特性提供給Activity,而且只能通過create()方法創建,此時它需要兩個參數,ActivityAppCompatCallback

所以,首先,我們將Activity實現AppCompatCallback接口,在本例中,可以不必具體實現要覆蓋的方法。

 1 public class MainActivity extends Activity implements AppCompatCallback {
 2     @Override
 3     public void onSupportActionModeStarted(ActionMode mode) {
 4       //let's leave this empty, for now
 5     }
 6     @Override
 7     public void onSupportActionModeFinished(ActionMode mode) {   
 8       // let's leave this empty, for now
 9     }
10 }
View Code

然后,在ActivityonCreate()方法中,

  1. 通過AppCompatDelegate.create()方法創建AppCompatDelegate
  2. 調用AppCompatDelegate.create();(有些Activity的生命周期方法應用由該AppCompatDelegate代理)
  3. 通過AppCompatDelegate.setContentView()方法填充布局文件;
  4. 通過AppCompatDelegate.setSupportActionbar()Toolbar添加給AppCompatDelegate
 1 private AppCompatDelegate delegate;
 2 @Override
 3 protected void onCreate(Bundle savedInstanceState) {
 4     super.onCreate(savedInstanceState);
 5     //let's create the delegate, passing the activity at both arguments (Activity, AppCompatCallback)
 6     delegate = AppCompatDelegate.create(this, this);
 7     //we need to call the onCreate() of the AppCompatDelegate
 8     delegate.onCreate(savedInstanceState);
 9     //we use the delegate to inflate the layout
10     delegate.setContentView(R.layout.activity_main);
11     //Finally, let's add the Toolbar
12     Toolbar toolbar= (Toolbar) findViewById(R.id.my_awesome_toolbar);
13     delegate.setSupportActionBar(toolbar);
14 }
View Code

 

特別推薦,一個Activity只能鏈接到一個AppCompatDelegate實例,因此通過create()方法返回的實例應該保存在Activity里面直到該Activity被銷毀。

現在,你已經完成了,運行你的應用,然后你的Activity將會魔法一般擁有一個Toolbar,而且看起來完全你是材料設計的AppCompatActivity

非常簡單?

再次聲明,這只是邊緣事例,在使用AppCompatDelegate之前,問題要考慮使用AppCompatActivity

同時,一定要檢出AppCompatDelegate的完全引用。如果你想要AppCompatDelegate活動地完全像一個AppCompatActivity,那么在你包裹AppCompatDelegateActivity時將有大量的方法需要考慮寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM