在版本21的修订中,带来了material color palette、控件着色、Toolbar支持,还有更多支持所有API 7+的设备。
以往使用AppCompat的唯一入口就是ActionBarActivity类,迫使你使用固定死的一套Activity结构,使得像PreferenceActivity这样的类无法利用AppCompat的特性。
现在,我们将ActionBarActivity里面的内部逻辑都抽离出来,然后封装成一个单一的代理(delegate) api供调用,AppCompatDelegate 。 AppCompatDelegate可以被任意带有Window.Callback的安卓对象创建,比如Activity或者Dialog的子类。你可以通过他的静态方法create()创建:
AppCompatDelegate.create(this, null);
但是
在使用delegate的时候有一些约束,你必须调用它暴露的每一个回调方法(比如onCreate()),但是这也不复杂,而且你还可以将他们写在一个基类中。只要你按照此要求,你就可以将AppCompat的功能应用在任意的Activity子类中。如果你打算使用AppCompatDelegate,我强烈建议你参考一下AppCompatActivity的源码,他是整合AppCompatDelegate的绝佳教材。
但是大多数人都不需要这么底层的自定义,直接使用我们的AppCompatActivity就足够了(就像之前使用ActionBarActivity一样)。
package android.support.v7.app;
public class AppCompatActivity extends FragmentActivity implements AppCompatCallback, TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider
{
private AppCompatDelegate mDelegate;
}
主要通过AppCompatDelegate类,获取不同的版本代理
private static AppCompatDelegate create(Context context, Window window,AppCompatCallback callback)
{
final int sdk = Build.VERSION.SDK_INT;
if (sdk >= 14)
return new AppCompatDelegateImplV14(context, window, callback);
} else if (sdk >= 11)
{
return new AppCompatDelegateImplV11(context, window, callback);
}
else
{
return new AppCompatDelegateImplV7(context, window, callback);
}
}
版本代理又互相集成
class AppCompatDelegateImplV14 extends AppCompatDelegateImplV11
class AppCompatDelegateImplV11 extends AppCompatDelegateImplV7
class AppCompatDelegateImplV7 extends AppCompatDelegateImplBase
abstract class AppCompatDelegateImplBase extends AppCompatDelegate
参考:
http://www.voidcn.com/blog/lrckid/article/p-5005031.html