Android 问题整理 二
// android 6.0+ 以上动态权限申请 api level 23+
——BaseActivity.java 中执行——
/**
* android 6.0 以上需要动态申请权限
*/
private void initPermission() {
String permissions[] = {Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.INTERNET,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
ArrayList<String> toApplyList = new ArrayList<String>();
for (String perm :permissions){
if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(context, perm)) {
toApplyList.add(perm);
//进入到这里代表没有权限.
}
}
String tmpList[] = new String[toApplyList.size()];
if (!toApplyList.isEmpty()){
ActivityCompat.requestPermissions((Activity) context, toApplyList.toArray(tmpList), PERMISSON_REQUESTCODE);
}
}
——–其他———-
if (Build.VERSION.SDK_INT >= 23) { int REQUEST_CODE_CONTACT = 101; String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE}; // 验证是否许可权限 for (String str : permissions) { if (checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) { // 申请权限 requestPermissions(permissions, REQUEST_CODE_CONTACT); } } }
// 包名冲突 参考文章
Failure [INSTALL_FAILED_CONFLICTING_PROVIDER:
Package couldn’t be installed in /data/app/com.china.swp-1:
Can’t install because provider name com.wq.photo.fileprovider (in package com.china.swp) is already used by com.china.pmc]
将项目中自己用到的地方所有的 com.wq 修改一个名称 (Ctrl Shift F 注意快捷键会被搜狗输入法或其他程序占用)
android:authorities="com.swp_wq.fileprovider" // AndroidManifest.xml
Uri uri = FileProvider.getUriForFile(getApplicationContext(), "com.swp_wq.photo.fileprovider", currentfile); // Uri
// Cannot access android.arch.lifecycle.LifecycleOwner 参考文章
pmc_qinmei
public class BsbEaseChatFragment extends EaseBaseFragment implements EMMessageListener
在项目的 Moudle:app 的 dependencies 中添加如下代码,sync now
implementation "android.arch.lifecycle:livedata:1.1.1"
implementation "android.arch.lifecycle:viewmodel:1.1.1"
implementation "android.arch.lifecycle:extensions:1.1.1"
// 支付宝 生成秘钥工具 secret_key_tools_RSA256_win 打不开
该文件不能放在有中文目录、空格的目录当中执行。
// 微信分享无法使用
微信分享官网提示,需要按照发布流程使用自定义keystore,使用打包后的apk进行安装,这时测试分享(代码没有问题)即可正常
// 微信登陆报错baseResp.errCode=-6 参考文章
1.baseResp.errCode=-6 就代表签名和打包的秘钥生成的签名不一致,会导致调起来的微信授权登录页一片空白,我用cocos的应用包名去生成md5签名和用keystore生成的签名不一致,不知道什么原因,导致我遇到了这样的问题,去微信开发平台改成
用keystore生成的签名就好了,
但问题来了,发现修改了签名还是一样没效果,我就很纳闷了,网上有人说是修改了开放平台的签名,要过一天才生效,但我发现有人说立马就生效了,但需要卸载微信重新安装,这是因为客户端会缓存之前的签名。然后就抱着试一试的心态,果然成功了。
微信开放平台的开发文档文档不详细,竟然没有-6的说明,坑坑
// mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi 对应的像素密度;参考文章 参考文章2
// android studio 安装APP提示关于 slice_3.apk 类似问题
// android recyclerview 的引入
在项目中引入
implementation 'com.android.support:appcompat-v7:26.1.0' // 这里的代码是原有的
implementation 'com.android.support:recyclerview-v7:26.1.0' // 引入这行代码就可以了,这里的版本号要和上面的一致,否则会报错
解决 ScrollView 嵌套 recyclerview ,item 不显示
view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_shop_detail, parent, false);
// recyclerView 上拉加载更多 参考文章https://www.jianshu.com/p/66d817325e94
滑动监听,判断是否滑动到了最后一个条目
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
//用来标记是否正在向最后一个滑动
boolean isSlidingToLast = false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//设置什么布局管理器,就获取什么的布局管理器
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
// 当停止滑动时
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
//获取最后一个完全显示的ItemPosition ,角标值
int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
//所有条目,数量值
int totalItemCount = manager.getItemCount();
// 判断是否滚动到底部,并且是向右滚动
if (lastVisibleItem == (totalItemCount - 1) && isSlidingToLast) {
//加载更多功能的代码
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//dx用来判断横向滑动方向,dy用来判断纵向滑动方向
//dx>0:向右滑动,dx<0:向左滑动
//dy>0:向下滑动,dy<0:向上滑动
if (dy > 0) {
isSlidingToLast = true;
} else {
isSlidingToLast = false;
}
}
});
作者:我爱吃青苹果
链接:https://www.jianshu.com/p/66d817325e94
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
或者用下列方法
public abstract class OnLoadMoreListener extends RecyclerView.OnScrollListener {
private LinearLayoutManager layoutManager;
private int itemCount, lastPosition, lastItemCount;
public abstract void onLoadMore();
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
itemCount = layoutManager.getItemCount();
lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
} else {
Log.e("OnLoadMoreListener", "The OnLoadMoreListener only support LinearLayoutManager");
return;
}
if (lastItemCount != itemCount && lastPosition == itemCount - 1) {
lastItemCount = itemCount;
this.onLoadMore();
}
}
}
作者:我爱吃青苹果
链接:https://www.jianshu.com/p/66d817325e94
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
// Recyclerview 数据不全/数据加载不全
recyclerview 外部添加一个布局
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:scrollbars="none" />
</RelativeLayout>
// android 支付宝 AliPayDemo154 秘钥获取
// 支付宝 生成秘钥工具secret_key_tools_RSA256_win 打不开
该文件不能放在有中文目录、空格的目录当中执行。
// Android studio 3.1.2 编辑layout(xml) 文件特别卡顿
Android studio 3.1.2 降级到 3.0.1 会好一些,3.1.3 也没有问题。
// BluetoothAdapter: Bluetooth binder is null
解决方案:
1、Androidmanifest.xml 没有蓝牙权限:
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
2、androidmanifest.xml 文件中有报错。
3、使用的是模拟器,模拟器没有蓝牙的功能。
参考文章:https://stackoverflow.com/questions/14474370/e-bluetoothadapter883-bluetooth-binder-is-null#
// recyclerview 滑动不流畅(ScrollView 嵌套 recyclerview 滑动不流畅)
// recyclerview 打开这个
recyclerView.setNestedScrollingEnabled(false);
参考文章
https://blog.csdn.net/xuwei1213/article/details/53994679
https://blog.csdn.net/u010696826/article/details/52808323
// recyclerview 复用,数据重复,滑动导致数据重复,不复用
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.setIsRecyclable(false);
// 获取 recyclerview 的 itemview
// RecyclerView获取ItemView方法实际比较简单,直接用LayoutManager实例的方法:
// positions是RecyclerView中每个item的位置
View view = layoutManager.findViewByPosition(position);
// 但是在fragment中如果直接调用上面的方法,返回的view为空,我们需要用handler的postDelayed方法延迟获取。
static Handler handler = new Handler(Looper.getMainLooper());
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
handler.postDelayed(runnable, 200);
}
Runnable runnable = new Runnable() {
@Override
public void run() {
View view = layoutManager.findViewByPosition(position);
}
};
作者:康熙微博私访记
链接:https://www.jianshu.com/p/3824147a80bf
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
// Banner 的属性
https://blog.csdn.net/android_mylife/article/details/53213678
// android 动态设置控件的高度,使用对应布局中的dp值
https://blog.csdn.net/shuang__zi/article/details/46360697
// recyclerview 内容不显示
1.没有设置布局管理器。
2.item的高度为 match_parent,改为固定值、或者wrap_content。
// Android Studio遇到报错:cannot delete xxx file
参考:这里
删除对应文件的上一级目录
// popupWindow 点击返回键 back 没有反应(popuwindow)
popupwindow设置一个参数:参考文章
popupWindow.setBackgroundDrawable(new BitmapDrawable());
// RecyclerView 中的 item 布局混乱
item 中的布局使用了weight 时,会失效。
解决方法:最外层使用 Relativelayout
// 获取 activity 中显示的是哪一个 fragment
FragmentManager fmanager;
FragmentTransaction ftransaction;
fmanager = getSupportFragmentManager();
ftransaction = fmanager.beginTransaction();
@SuppressLint("RestrictedApi")
List<Fragment> fragmentList = fmanager.getFragments();
for (Fragment fragment : fragmentList) {
if(fragment != null && fragment.isVisible()){
// Log.e("fragment.isVisible",""+fragment.toString().substring(0,fragment.toString().indexOf("{")));
switch (""+fragment.toString().substring(0,fragment.toString().indexOf("{"))) {
case "HomeFragment":
mRadioButtonHome.setChecked(true);
break;
case "ClassifyFragment":
mRadioButtonClassfity.setChecked(true);
break;
}
}
}
// xml 无法显示,报错:Failed to load AppCompat ActionBar with unknown error.
参考:https://blog.csdn.net/qq_36332133/article/details/80808123
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
</style>
改为
<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
</style>