Multiple entries with same key:
尝试从tools:replace
列表中删除空格。
1 | tools:replace="android:label,theme,allowBackup,android:icon,android:supportsRtl" |
这为我修复了构建错误,但我仍在试图找出为什么忽略空格后的条目.
select * from learn
Multiple entries with same key:
尝试从tools:replace
列表中删除空格。
1 | tools:replace="android:label,theme,allowBackup,android:icon,android:supportsRtl" |
这为我修复了构建错误,但我仍在试图找出为什么忽略空格后的条目.
Hexo的永久链接的默认格式是
:year/:month/:day/:title/
,比如访问站点下某一篇文章时,其路径是2018/04/12/xxxx/
,如果我们的文章标题是中文的,那么该路径就会出现中文字符。在路径中出现了中文字符很容易引发各种问题,而且也不利于seo,因为路径包含了年月日三个层级,层级太深不利于百度蜘蛛抓取。
*解决办法就是利用其它的插件来生成唯一的路径,这样就算我们的文件标题随意修改,而不会导致原本的链接失效而造成站点下存在大量的死链。 *
在站点根目录使用 git bash 执行命令:
1 | npm install hexo-abbrlink --save |
打开根目录下的_config.yml
文件,修改如下配置:
1 | # permalink: :year/:month/:day/:title/ |
这里将页面都添加了.html
的后缀,用来伪装成静态页面(虽说Hexo的页面本身就是静态页面),这样可以直接从路径就知道这是个静态页面,方便seo。
接下来重新部署三连,可以看到我们的文章路径变成了/posts/xxxxx.html
,接下来就算我们将文字标题命名为中文也没问题了。
有时候,需要获取当前位于栈顶的activity的实例。这里介绍2种方法,以及各自适用的场景。
应用场景:项目中,activity都继承于一个BaseActivity,在这个base中,有个广播接收器,收到广播,就弹出一个dialog。现打开多个activity,这个时候,通过三方推送等方法,发出一个广播,base接收到。因为只需要在栈顶的activity弹出,而不是每个activity都弹出,所以,需要获取栈顶activity的实例(即上下文,传给dialog的构造方法),而不能简单的传个this,否则,会导致每个activity都有dialog弹出。
在进行Fragment的添加和删除时,适配器刷新之后发现并没有什么变化,这是为什么呢?
FragmentPagerAdapter
适合少量的页面显示。该类每一个生成的Fragment对象都会储存在内存中,所以适合相对静态、页面少的情况,如果是页面多,且Fragment的处理相对动态(添加、删除等)时,使用FragmentStatePagerAdapter较为适合。
FragmentStatePagerAdapter
适合大量的页面显示,当页面处于不可见时,可能会被销毁,只保留该片段的保存状态。与FragmentPagerAdapter切换页面产生的大量开销对比,这允许了适配器保持与每个被访问页面相关联的更少的存储器。
在切换页面时,FragmentPagerAdapter与FragmentStatePagerAdapter对于上上页(预加载默认1,所以取上上页)的处理是不相同的,FragmentPagerAdapter只是销毁对应Fragment的视图,而FragmentStatePagerAdapter则是把Fragment的实例和视图都销毁了。
当我们对页面进行动态处理时,添加(或删除)是对适配器所持有的list对象进行长度的变化,操作完之后就进行适配器的刷新,也就是notifyDataSetChanged方法,先看看该方法:
学习,学习,学以致用
ViewFlipper是安卓自带的控件,很多人可能很少知道这个控件,这个控件很简单,也很好理解。
从源码可以看出,其实ViewFlipper间接的继承了FrameLayout,也可以说ViewFlipper其实就是个FrameLayout,只不过在内部封装了动画实现和Handler实现一个循环而已。
很经常当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0.view.getWidth()和view.getHeight()为0的根本原因是控件还没有完成绘制,你必须等待系统将绘制完View时,才能获得。这种情况当你需要使用动态布局(使用wrap_content或match_parent)就会出现。一般来讲在Activity.onCreate(…)、onResume()方法中都没有办法获取到View的实际宽高。所以,我们必须用一种变通的方法,等到View绘制完成后去获取width和Height。下面有一些可行的解决方案。
ViewTreeObserver监听很多不同的界面绘制事件。一般来说OnGlobalLayoutListener就是可以让我们获得到view的width和height的地方.下面onGlobalLayout内的代码会在View完成Layout过程后调用。
1 | view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { |
但是要注意这个方法在每次有些view的Layout发生变化的时候被调用(比如某个View被设置为Invisible),所以在得到你想要的宽高后,记得移除onGlobleLayoutListener: