这只是一篇随便,在研究Android过程中的一些小坑或大坑将会随笔记下,以备来日观看,本文将会持续更新(有坑就更新)。
Toolbar中的小坑:
在研究Toobar的时候,跑去官网看文档去了,文档中的第三步是这样写的
3.In the app manifest, set the <application>
element to use one of appcompat's NoActionBar
themes. Using one of these themes prevents the app from using the native ActionBar
class to provide the app bar. For example:
<application android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
官方文档的第三步说的是如果要使用Toobar,那么久必须去除掉原生ActionBar,我们可以在AndroidMainfest.xml配置文件中直接在application的theme主题这里设置为NoActionBar的主题。
没错这确实可以去除掉ActionBar,显示Toobar。但坑人的是使用了这种方法之后,会发现Toobar是灰白样式的,它的colorPrimary/colorPrimaryDark/colorAccent这些设置都不能起作用,也就是说不能更换Toobar的颜色!
然后我就不明所以的疑惑了大半天,为什么是灰白色的呢?
其中的原因我不太了解,但是解决办法倒是找到了,既是不要在AndroidMainfest.xml配置文件中设置Theme为NoActionBar的主题,去styles.xml文件下的style下设置windowActionBar熟悉,代码如下:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="actionOverflowMenuStyle">@style/GoodStyle</item>
</style>
// GoodStyle样式可以设置Toolbar中的Menu项目会往下排,具体效果可以自己测试
<style name="GoodStyle" parent="@style/Widget.AppCompat.Light.PopupMenu.Overflow">
<item name="overlapAnchor">false</item>
</style>
启动Activity和Dialog
在Andorid中启动Activity和弹出Dialog是要使用Context对象的,但是出于安全考虑,Activity是不允许凭空出现的,所以Activity必须在另一个Activity的基础上启动,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。
所以弹出dailog的时候传入的Context是getApplicationContext必定会报错。
而不再Actiivity中启动另一个Activity也是会报错的,可以在Intent中设置Flag为Intent.FLAG_ACTIVITY_NEW_TASK表示创建一个新的任务栈启动Activity,关键代码如下:
inten.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
获取Applicaiton
在项目中经常会自定义一个Applicaiton,而在网络上经常看到大家获取Applicaiton的时候直接用单例模式这种错误方法,如下:
public class MyApplication extends Application {
private static MyApplication app;
public static MyApplication getInstance() {
if (app == null) {
app = new MyApplication();
}
return app;
}
}
为什么这是错误的方法呢?Application是属于系统组件,系统组件的实例是要由系统来去创建的,如果这里我们自己去new一个MyApplication的实例,它就只是一个普通的Java对象而已,而不具备任何Context的能力。
所以正确的写法应该是下面这种形式:
public class MyApplication extends Application {
private static MyApplication app;
public static MyApplication getInstance() {
return app;
}
@Override
public void onCreate() {
super.onCreate();
app = this;
}
}
getInstance()方法可以照常提供,但是里面不要做任何逻辑判断,直接返回app对象就可以了,而app对象又是什么呢?在onCreate()方法中我们将app对象赋值成this,this就是当前Application的实例,那么app也就是当前Application的实例了。
网友评论