美文网首页
Android之坑

Android之坑

作者: 宝塔山上的猫 | 来源:发表于2016-09-19 23:38 被阅读102次

    这只是一篇随便,在研究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的实例了。

    相关文章

      网友评论

          本文标题:Android之坑

          本文链接:https://www.haomeiwen.com/subject/zbwnettx.html