本文链接: Android面经-基础篇(持续更新…) - CSDN博客 ,在此说明本人可能用到很多博客的链接以及话语引用没有说明,请相关的博主莫怪,本人也没有想过靠这些来进行吸引来达到盈利的目的,纯碎是为了保存好这些自己觉得写得很好的博文
探讨:加载布局inflate(int resource, ViewGroup root, boolean attachToRoot)
- 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。
- 如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。
- 如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。
- 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。
郭霖先生的博客讲解到:Android LayoutInflater原理分析,带你一步步深入了解View(一) - 郭霖的专栏 - CSDN博客
验证代码:
1.activity_main.xml:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/lyo_content"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#ff0"
android:orientation="vertical"/>
LinearLayout>
2.button_layout.xml:
<Button
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp"
android:layout_height="80dp"
android:text="Button">
Button>
3.button_layout1.xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="300dp"
android:layout_height="80dp"
android:text="Button"/>
RelativeLayout>
4.
mainLayout = (LinearLayout) findViewById(R.id.main_layout);
lyo_content = (LinearLayout) findViewById(R.id.lyo_content);
LayoutInflater layoutInflater = LayoutInflater.from(this);
View buttonLayout0 = layoutInflater.inflate(R.layout.button_layout, null);
mainLayout.addView(buttonLayout0);
View buttonLayout00 = layoutInflater.inflate(R.layout.button_layout, null);
lyo_content.addView(buttonLayout00);
View buttonLayout1 = layoutInflater.inflate(R.layout.button_layout, mainLayout, true);
//mainLayout.addView(buttonLayout);不可以再设置父布局buttonLayout1,因为它有了父布局
View buttonLayout2 = layoutInflater.inflate(R.layout.button_layout, mainLayout, false);
mainLayout.addView(buttonLayout2);
View buttonLayout22 = layoutInflater.inflate(R.layout.button_layout, mainLayout, false);
lyo_content.addView(buttonLayout22);
View buttonLayout3 = layoutInflater.inflate(R.layout.button_layout1, null);
mainLayout.addView(buttonLayout3);
解释:当一个view加载的时候没有父布局(没有xml中设置以及代码加载时候没有指定),设置的layout_width跟layout_height都是无用的,一个布局有且仅有绑定在一个布局(只可以绑定一次),一旦绑定必须解绑才可以绑定到其他布局去
这里有两个有趣的问题:
1.如下面代码所示,两个加载布局都是用mainLayout属性属性进行加载的(当时都没有绑定),之后一个绑定在mainLayout,一个绑定在lyo_content上,造成了上面截图的结果
View buttonLayout2 = layoutInflater.inflate(R.layout.button_layout, mainLayout, false);
mainLayout.addView(buttonLayout2);
View buttonLayout22 = layoutInflater.inflate(R.layout.button_layout, mainLayout, false);
lyo_content.addView(buttonLayout22);
2.为什么activity_main布局的第一层是有效的
因为它预先加载了一个id为content的FrameLayout来装载activity_main这个布局
3.关于B拦截了子视图C的Move事件B本身不消费,是否上交给上司处理呢? - CSDN博客
4.Android关于触摸事件跟点击事件两个方法的关系 - CSDN博客
5.Android中事件分发机制 - qq97206858的博客 - CSDN博客
在3.0之后不可以通过okHttpClient.cancel(tag)来取消一个请求
call.cancel();//直接取消当前的请求
client.dispatcher().cancelAll();//取消当前客户端上的全部请求
你也可以自己封装一个方法,按TAG来取消所有请求:
public void cancle(Object tag,OkHttpClient okHttpClient){
Dispatcher dispatcher = okHttpClient.dispatcher();
synchronized (dispatcher){
//遍历请求队列里面的
for (Call call : dispatcher.queuedCalls()) {
if (tag.equals(call.request().tag())) {
call.cancel();
}
}
//遍历在运行队列里面的
for (Call call : dispatcher.runningCalls()) {
if (tag.equals(call.request().tag())) {
call.cancel();
}
}
}
}
实际上,我们一般使用OkHttp开源库居多一点:OkHttpFinal OkHttp 封装的一个简单易用 HTTP 请求和文件下载管理框架。 @codeKK Android 开源站
面试穿正装会加分么?
如果对你有帮助,可以点击“推荐”哦`(*∩_∩*)′