「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
android studio下载安装
下载安装android studio时,在官网下载linux版本,解压,在~/下载/android-studio-ide-191.5977832-linux/android-udio/bin路径下执行./studio.sh命令。
出现Unable to access Android SDK add-on list问题
直接点击退出,在后续下载sdk,直接点击next
下载过程出现Android SDK Platform-Tools, SDK Patch Applier v4 and 5 more SDK components were not installed问题
点击退出,在创建项目时,继续下载sdk,完成。
创建完项目出现Failed to load module "canberra-gtk-module"问题 sudo apt-get install libcanberra-gtk-module
android studio 基础知识
一. 多线程编程问题:
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
});
问题:
1.不能在主线程以外操作UI,android中把耗时的操作都放到子线程里面,主线程又叫UI线程
(1)不要阻塞主线程(UI线程) (2)不要从主线程以外的线程更新UI(UI线程)
方法1:
可以使用Activity的runOnUiThread方法将对UI的操作发布到主线程。 从主线程调用时,runOnUiThread方法立即执行传递的操作,但是当从主线程以外调用时,它会将传递的操作发布到主线程的事件队列。
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tv.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "FourActivity3 click button", Toast.LENGTH_SHORT).show();
tv.setText("FourActivity3 click button");
}
});
}
方法2:
最经典的方式,扩展性最好,使用最广泛的,就是Thread+Handler实现异步消息处理
//这个地方的handler最好封装 防止内存泄漏
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 100) {
String res = (String) msg.obj;
tv.setText(res);
Toast.makeText(getApplicationContext(), res, Toast.LENGTH_SHORT).show();
}
}
};
Fragment
在Java中设置View的layout_weight
LinearLayout view = (LinearLayout) findViewById(R.id.right_layout);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
view.setLayoutParams(layoutParams);
LinearLayout.LayoutParams的三个参数为宽,高,weight
回退栈
-
addToBackStack(tag); 将Fragment添加到回退栈中
-
popBackStack(); 清除回退栈中栈顶的Fragment
-
popBackStack(String tag, int i );
如果i=0,回退到该tag所对应的Fragment层
如果i=FragmentManager.POP_BACK_STACK_INCLUSIVE,回退到该tag所对应的Fragment的上一层
-
popBackStackImmediate 立即清除回退栈中栈顶Fragment
-
getBackStackEntryCount(); 获取回退栈中Fragment的个数
-
getBackStackEntryAt(int index) 获取回退栈中该索引值下的Fragment
Fragment切换
RecyclerView与Touch监听冲突
解决方法:
使用dispatchTouchEvent()方法,进行事件分发。
-
public boolean dispatchTouchEvent( MotionEvent event)
用于进行事件的分发,如果事件能够传递给当前的View,那么此方法一定会被调用。返回结构受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。 -
public boolean onIntercptTouchEvent( MotionEvent event )
在上述方法内部调用,用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列中,此方法不会被再次调用,返回结果是表示是否拦截当前事件。本方法不在View内部,在ViewGroup中的dispatchEvent被调用。 -
public boolean onTouchEvent( MotionEvent event )
在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接收到事件,事件全部往下传递给子View去了。