人升开发日志#14 | 03/21 几个小问题的解决

ViewPager + Fragments 导致的选项菜单错乱解决

原先的Toolbar实现

在Fragment中获取Toolbar这个View,然后调用Activity的setSupportActionBar(toolbar)方法。

然后实现Option菜单的方法:在Fragment中设置setHasOptionsMenu(true),然后重写fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater)方法。

出现的问题:似乎是因为ViewPager的缓存机制,导致切换Fragments切换的时候可能出现菜单错乱的情况。

解决:把Toolbar当做控件使用

MainActivity.kt

1
2
3
4
5
6
7
8
9
10
11
12
13
fun initToolBar(toolbar: Toolbar) {
//setSupportActionBar(toolbar) 注释掉这条

currentToolbar = toolbar
val toggle = ActionBarDrawerToggle(
this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
drawer_layout.addDrawerListener(toggle)
nav_view.setNavigationItemSelectedListener(this)
}

fun getCurrentToolbar(): Toolbar? {
return currentToolbar
}

Fragment.kt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private fun initToolbar(view: View) {
//设置toolbar
mToolbar = view.findViewById(R.id.toolbar)
(activity as MainActivity).initToolBar(mToolbar)

// 填充菜单
mToolbar?.inflateMenu(R.menu.main)
mToolbar?.setOnMenuItemClickListener { item ->
when (item.itemId) {
R.id.action_sort -> {
// do something
true
}
else -> true
}
}
}


菜单同时显示图标和文字

没有直接实现的方法,这里可以利用反射:

1
2
3
4
5
6
7
8
9
10
11
12
if (mToolbar != null) {
val mMenu = mToolbar!!.menu
if (mMenu.javaClass.simpleName.contentEquals("MenuBuilder")) {
try {
val method = mMenu.javaClass.getDeclaredMethod("setOptionalIconsVisible", java.lang.Boolean.TYPE)
method.isAccessible = true
method.invoke(mMenu, true)
} catch (e: Exception) {
e.printStackTrace()
}
}
}


用代码动态调整MaxWidth

1
2
3
4
5
6
7
8
9
val tw = helper.getView(R.id.tv_nickname) as TextView
val cw = helper.getView(R.id.cl_history) as ConstraintLayout
val twDate = helper.getView(R.id.tv_btn) as TextView
cw.post {
val newMaxWidth = cw.width - DensityUtil.dp2px(72f) - twDate.width
if (newMaxWidth > 0) {
tw.maxWidth = newMaxWidth
}
}


Android P 发送不了网络请求

这是因为Android P默认禁用了HTTP请求,只支持HTTPS。

1. 在AndroidManifest.xml的Application标签加上:

1
android:networkSecurityConfig="@xml/network_security_config"

2. 然后在res/xml文件夹里新建network_security_config.xml文件:

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>


全面屏简单适配

在`AndroidManifest.xml的Application标签里声明一下支持的屏幕高宽比

1
<meta-data android:name="android.max_aspect" android:value="2.4" />

评论