标签:resources sam creat nal fill 布局文件 初始化 name dea
<style name="roomRatingBar" parent="@android:style/Widget.RatingBar">
<item name="android:progressDrawable">@drawable/room_rating_bar</item>
<item name="android:minHeight">24dip</item>
<item name="android:maxHeight">24dip</item>
</style>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 第一张图是设置未选中,第二张图是设置半个星星,第三张图则是设置为整个星星。也就是说我们要自己去找三张这样的图咯-->
<item android:id="@android:id/background" android:drawable="@drawable/rating_small_empty" />
<item android:id="@android:id/secondaryProgress" android:drawable="@drawable/rating_small_half" />
<item android:id="@android:id/progress" android:drawable="@drawable/rating_small_full" />
</layer-list>
<RatingBar
android:id="@+id/ratingBar"
style="@style/roomRatingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="9dp"
android:isIndicator="true" />
//如果像平常这样使用butterknife去注解它,它是构造不了视图的,进而渲染不了,出异常。
@BindView(R.id.retingbar)
RatingBar retingbar;
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
View view = layoutInflater.inflate(R.layout.fragment_ability, null);
ratingBar = (RatingBar) view.findViewById(R.id.ratingBar);
//每个控件的初始化大致生成这样的代码:
public class ExampleActivity$$ViewBinder<T extends
io.bxbxbai.samples.ui.ExampleActivity> implements ViewBinder<T> {
@Override public void bind(final Finder finder, final T target, Object source) {
View view;
view = finder.findRequiredView(source, 21313618, “field ‘user’”);
target.username = finder.castView(view, 21313618, “field ‘user’”);
view = finder.findRequiredView(source, 21313618, “field ‘pass’”);
target.password = finder.castView(view, 21313618, “field ‘pass’”);
view = finder.findRequiredView(source, 21313618, “field ‘submit’ and method ‘submit’”);
view.setOnClickListener(
new butterknife.internal.DebouncingOnClickListener() {
@Override public void doClick(android.view.View p0) {
target.submit();
}
});
}
@Override public void reset(T target) {
target.username = null;
target.password = null;
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//第一个参数就是要加载的布局id,第二个参数是指给该布局的外部再嵌套一层父布局,如果不需要就直接传null。这样就成功成功创建了一个布局的实例
//一会讲解此原理
View view = inflater.inflate(getLayoutId(), container, false);
ButterKnife.bind(this, view);//传一个上下文,以及取出来的父view
return view;
}
//参数传至此
@NonNull @UiThread
public static Unbinder bind(@NonNull Object target, @NonNull View source) {
return createBinding(target, source);
}
private static Unbinder createBinding(@NonNull Object target, @NonNull View source) {
//先拿到那个上下文
Class<?> targetClass = target.getClass();
if (debug) Log.d(TAG, "Looking up binding for " + targetClass.getName());
// 再拿到上下文所包含的那个视图构造器
Constructor<? extends Unbinder> constructor = findBindingConstructorForClass(targetClass);
if (constructor == null) {
return Unbinder.EMPTY;
}
//noinspection TryWithIdenticalCatches Resolves to API 19+ only type.
try {
//传递给视图构造器去渲染绘制
return constructor.newInstance(target, source);
} catch (IllegalAccessException e) {
throw new RuntimeException("Unable to invoke " + constructor, e);
} catch (InstantiationException e) {
throw new RuntimeException("Unable to invoke " + constructor, e);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
}
if (cause instanceof Error) {
throw (Error) cause;
}
throw new RuntimeException("Unable to create binding instance.", cause);
}
}
//返回值View:返回的值是View指向的根节点。
/*
第一个参数resource。也就说根据其他几个方法传进来的xml布局文件在这里会被用传进来的parser进行解析
第二个参数root:表示根结点,它的作用主要取决于第三个参数
第三个参数attachToRoot:表示是否将转换后的VIEW直接添加在根结点上,如果是TRUE,那么在转换出来VIEW之后,内部直接会调用root.addView()来将其添加到root结点上,然后返回根结点,当然是我们传进去的ROOT结点。如果设为FALSE,那只会将XML布局转换成对应的VIEW,不会将其添加的我们传进去的root结点上。
*/
/*
1. 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。
2. 如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。
3. 如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。
4. 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。
*/
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {
final Resources res = getContext().getResources();
if (DEBUG) {
Log.d(TAG, "INFLATING from resource: \"" + res.getResourceName(resource) + "\" ("
+ Integer.toHexString(resource) + ")");
}
final XmlResourceParser parser = res.getLayout(resource);
try {
return inflate(parser, root, attachToRoot);
} finally {
parser.close();
}
}
Android-ButterKnife不能注解RatingBar(含ButterKnife部分原理以及View传递机制)
标签:resources sam creat nal fill 布局文件 初始化 name dea
原文地址:http://blog.csdn.net/jack__frost/article/details/59490388