视图
Android app所有界面UI组件都是一个View,它们都继承自android.view.View这个类。视图主要包括两大类,一种是像Button这种非容器视图,另一种是容器视图。
android.view.View
视图属性
在创建一个视图时有一个很重要的参数AttributeSet,用于指定视图的属性信息,最常见的如背景、背景颜色、宽度、高度以及布局宽和布局高等。这个参数主要在通过资源、布局文件设计时非常有用。
public interface AttributeSet {
public int getAttributeCount();
default String getAttributeNamespace (int index) {
// This is a new method since the first interface definition, so add stub impl.
return null;
}
public String getAttributeName(int index);
public String getAttributeValue(int index);
public String getAttributeValue(String namespace, String name);
public String getPositionDescription();
public int getAttributeNameResource(int index);
public int getAttributeListValue(String namespace, String attribute,
String[] options, int defaultValue);
public boolean getAttributeBooleanValue(String namespace, String attribute,
boolean defaultValue);
public int getAttributeResourceValue(String namespace, String attribute,
int defaultValue);
public int getAttributeIntValue(String namespace, String attribute,
int defaultValue);
public int getAttributeUnsignedIntValue(String namespace, String attribute,
int defaultValue);
public float getAttributeFloatValue(String namespace, String attribute,
float defaultValue);
public int getAttributeListValue(int index, String[] options, int defaultValue);
public boolean getAttributeBooleanValue(int index, boolean defaultValue);
public int getAttributeResourceValue(int index, int defaultValue);
public int getAttributeIntValue(int index, int defaultValue);
public int getAttributeUnsignedIntValue(int index, int defaultValue);
public float getAttributeFloatValue(int index, float defaultValue);
public String getIdAttribute();
public String getClassAttribute();
public int getIdAttributeResourceValue(int defaultValue);
public int getStyleAttribute();
}
一般我们很少直接使用到AttributeSet,就算我们有需要自己在代码中创建视图,也主要传Context参数,通过调用java方法指定相关信息,而很少直接通过AttributeSet来指定视图信息。Android也主要给我们提供了一个这样的接口,另外还有一个XmlResourceParser接口,并没有给我们提供什么实现。
如果我们要直接使用到这个东西,还需要自行实现AttributeSet接口。
创建视图
所有视图组件都继承了View类,View类的构造至少需要有一个Context参数,所以在创建视图时也至少需要指定Context参数。
public View(Context context)
public View(Context context, @Nullable AttributeSet attrs)
public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
如下创建一个TextView文本视图的例子。
背景
通过setBackground、setBackgroundDrawable、setBackgroundResource、setBackgroundColor这些方法可以给View设置背景,setBackgroundColor方法设置的是背景颜色。
setBackground、setBackgroundDrawable方法指定一个Drawable对象来设置背景,setBackgroundResource方法设置的是一个Drawable资源。
圆角
可以通过给View绘制一个带圆角的shape或者给View设置一个带圆角的shape来实现圆角的效果。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke android:width="1dip" android:color="#FF0000" />
<solid android:color="@android:color/transparent"/>
<corners
android:bottomLeftRadius="12dp"
android:bottomRightRadius="12dp"
android:topLeftRadius="12dp"
android:topRightRadius="12dp"/>
</shape>
如上一个带圆角的shape,然后调用setBackgroundResource(R.drawable.shape) 来实现圆角的效果。
可见状态
可以通过setVisibility方法设置View可见或不可见。如果设置为VISIBLE,View将可见,如果设置为INVISIBLE,View将不可见。Visibility除了控制View可见或不可见之外,还影响到其是否占用布局空间,如果可见,即VISIBLE,那么肯定会占用布局空间的,如果是INVISIBLE,这个仅仅是View不可见,但还是会占用布局空间。除了VISIBLE和INVISIBLE,Android还提供了GONE,这个也是不可见的,但不会占用布局空间。
事件
当对View进行操作的时候,就会触发对应的事件,如最常见的Click事件等。一个事件由事件源、事件的动作以及事件的处理这3个要素组成。
Android对大量各种事件都做了定义,如ScrollChange,对应的OnScrollChange以及OnScrollChangeListener、LayoutChange,对应的OnLayoutChange以及OnLayoutChangeListener、CapturedPointer,对应的OnCapturedPointer以及OnCapturedPointerListener、Key,对应的OnKey以及OnKeyListener、UnhandledKeyEvent,对应的OnUnhandledKeyEvent以及OnUnhandledKeyEventListener、Touch,对应的OnTouch以及OnTouchListener、Hover,对应的OnHover以及OnHoverListener、GenericMotion,对应的OnGenericMotion以及OnGenericMotionListener、LongClick,对应的OnLongClick以及OnLongClickListener、Drag,对应的OnDrag以及OnDragListener、FocusChange,对应的OnFocusChange以及OnFocusChangeListener、Click,对应的OnClick以及OnClickListener、ContextClick,对应的OnContextClick以及OnContextClickListener等等。
Click事件
Touch事件
Touch事件是触控时产生的一套事件的组成,其中触发了多个事件。对于触发多个事件的情况,其实我们的Click事件也触发了多个事件,当我们click的时候,按下是一个事件,按下后释放也是一个事件。不过Touch事件要比Click事件要复杂得多。其实Click事件也算是一种Touch事件。
事件处理
TextView默认是不可编辑的,可以通过设置android:editable属性使之进入可编辑状态,该属性默认为false,即不可编辑状态,如果设置为true,将进入可编辑状态。对于TextView,该属性已废弃。
和EditText不同的是,EditText默认是可编辑的,android:editable属性默认为true。并且就算TextView设置android:editable属性为true进入可编辑状态,但并不会自动获取焦点,这个不同于EditText,EditText会自动获取焦点。
如果需要通过代码方式使得TextView可编辑,不能对照android:editable属性去设置,这个属性已废弃,Android也没有提供这样的方法来设置。可以对照android:inputType属性,调用setInputType方法使之可编辑。这个方法只是让TextView可编辑,但还无法接收键盘输入,还需要调用setFocusable方法使之能获得焦点。
EditText
EditText editTextField = new EditText(this);
contentLayoutView.addView(editTextField);
去掉下横线
默认情况下,EditText下面会有一条横线。如果想要不显示这条横线的话,可以去掉背景或者将背景设置为透明或白色。设置背景可以通过setBackground或者setBackgroundColor方式。
去掉背景可以将背景设置为null,即setBackground(null)。
将背景颜色设置为透明,可以采用setBackground方式,setBackground(new ColorDrawable(getResources().getColor(R.color.transparent)))。
也可以采用setBackgroundColor 方式,setBackgroundColor(getResources().getColor(R.color.transparent)),采用setBackgroundColor 方式还可以直接指定一个Color值,setBackgroundColor(Color.argb(0x00, 0x00, 0x00, 0x00)),透明色(transparent)可以指定为#00000000,其实只需要最前面的alpha为0就可以,后面的red,green,blue分量可以随便指定,如setBackgroundColor(Color.argb(0x00, 0xff, 0xff, 0xff))。
ImageView
给视图设置背景,这个背景其实就是一个Drawable对象,我们可以通过getBackground方法得到这个背景,也就是一个Drawable对象。我们还可以通过这个Drawable对象设置背景的透明度,设定透明度指定的alpha其实也是一个颜色分量,取0~255的值,这个setAlpha方法的定义也可以看出。0表示完全透明,255表示完全不透明。
public abstract void setAlpha(@IntRange(from=0,to=255) int alpha);
如下:
setBackground(Drawable.createFromPath(uri.getPath()));
getBackground().setAlpha(150);
给视图设置前景也是同样的道理,
Button
Button loginButton = new Button(this);
loginButton.setText("登录");
contentLayoutView.addView(loginButton);
CheckBox
checkBox = new CheckBox(context);
checkBox.setText("原图");
toolbar.addView(checkBox);
自定义CheckBox样式
注意这里我们设置的是背景样式,所以这里没有设置显示文本,有时候我们可能就希望这样的一个CheckBox。
如果设置显示文本的话,文本直接显示在这个背景上。
checkBox = new CheckBox(context);
checkBox.setButtonDrawable(null);
checkBox.setScaleX(0.8f);
checkBox.setScaleY(0.8f);
checkBox.setBackground(context.getResources().getDrawable(R.drawable.check_style));
toolbar.addView(checkBox);
当然也可以通过设置CheckBox上的那个Button样式,如下,这里我们设置了显示文本,文本还是保持原样显示在那个Button后面。
checkBox = new CheckBox(context);
checkBox.setText("原图");
checkBox.setButtonDrawable(
context.getResources().getDrawable(R.drawable.check_style));
toolbar.addView(checkBox);
ListView
ListView是Android提供的一个常用的列表视图。它继承了AbsListView抽象类。ListView通过一个Adapter来提供数据以及列表中每一行的视图显示。通过setAdapter方法给ListView设置一个Adapter。
ListView重写了AbsListView中的setAdapter方法,AbsListView中的setAdapter方法实现了AdapterView中的setAdapter方法。
滚动条淡出设置
listView.setScrollBarFadeDuration(0);
listView.setScrollbarFadingEnabled(false);
设置ListView滚动条样式
默认情况下,ListView显示的滚动条就是一条很细长的矩形条。可以通过setVerticalScrollbarThumbDrawable或者setHorizontalScrollbarThumbDrawable方法设置自己想要的样式,通过设置一个Drawable,绘制一个自己想要的滚动条样式。
如我们创建如下一个drawable资源:shape.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient android:angle="0"
android:startColor="#0000"
android:endColor="#ff0000"/>
<corners android:radius="6dp"/>
<stroke android:width="1dp"
android:color="#a4000000"/>
</shape>
然后在代码里或者布局配置文件中设置一下,在代码中设置的话如下:
listView.setVerticalScrollbarThumbDrawable(
context.getResources().getDrawable(R.drawable.shape));
效果如下:
AbsListView
AbsListView是实现列表类视图,包括网格视图的基类。它继承了AdapterView抽象类。
AdapterView
AdapterView是一种通过Adapter来填充内容的视图,即它的子视图以及数据的提供是通过Adapter来完成的。参考Adapter接口定义。
适配器
适配器用于对应视图AdapterView,比较常见的ListView,并为这些视图提供数据以及每一项的视图显示。
适配器接口
Adapter
接口定义
public interface Adapter {
void registerDataSetObserver(DataSetObserver observer);
void unregisterDataSetObserver(DataSetObserver observer);
int getCount();
Object getItem(int position);
long getItemId(int position);
boolean hasStableIds();
View getView(int position, View convertView, ViewGroup parent);
static final int IGNORE_ITEM_VIEW_TYPE = AdapterView.ITEM_VIEW_TYPE_IGNORE;
int getItemViewType(int position);
int getViewTypeCount();
static final int NO_SELECTION = Integer.MIN_VALUE;
boolean isEmpty();
default @Nullable CharSequence[] getAutofillOptions() {
return null;
}
}
列表适配器接口
ListAdapter
列表适配器接口是为列表视图定义的接口,它扩展了Adapter接口。
接口定义
public interface ListAdapter extends Adapter {
public boolean areAllItemsEnabled();
boolean isEnabled(int position);
}
分割线
ListView在显示列表的时候,列表中的每一项之间默认会有一条分割线。
这条分割线通过setDivider设置。这个divider是一个Drawable对象。在代码中可以简单的设置一个自定义的颜色,如调用setDivider将这条分割线设置为绿色:getResources().getDrawable(R.color.green)。也可以设置一个更复杂的, 将这条分割线设置为一个drawable资源:getResources().getDrawable(R.drawable.listview_item_divider),这里listview_item_divider是res/drawable文件下的一个XML资源文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="45dp"
android:insetRight="0dp"
android:drawable="@color/black">
</inset>
对应代码方式来实现的话,资源文件中的inset对应InsetDrawable这个Drawable类
InsetDrawable divider = new InsetDrawable(
new ColorDrawable(getResources().getColor(R.color.black)),
100,
0,
0,
0);
然后调用setDivider传入divider这个drawable:setDivider(divider)。
有时候我们不想要这样的效果,不想要这条分割线,这可以调用setDivider方法来实现我们的效果,如果我们不想要这条分割线,可以把divider指定为null。
将这条分割线的高度设置为0也可以去掉这条分割线。调用setDividerHeight方法将这个分割线的高度设置为0.
列表项点击事件处理
ListView继承了AdapterView的setOnItemClickListener可以指定列表项点击时的事件处理。指定一个OnItemClickListener,该接口在AdapterView内部定义:
public interface OnItemClickListener {
void onItemClick(AdapterView<?> parent, View view, int position, long id);
}
实现这个接口的onItemClick方法以处理列表项点击时的事件。onItemClick方法表示点击列表项触发的事件处理。这个方法有4个参数,第1个参数parent类型为AdapterView<?>,表示触发点击的AdapterView,在这里就是ListView;第2个参数view类型为View,表示AdapterView中被点击的视图,在这里就是ListView中被点击的列表项,也就是被点击的那一行;第3个参数position是int类型,表示这个列表行对应的数据行在数据集中的位置;第4个参数是long类型。
当我们在处理列表行点击事件的时候,我们通常需要获取行对应的数据项,根据上面onItemClick方法定义来看,如果需要获取行对应的数据项,合理的方法应该是先得到AdapterView对应的Adapter,然后根据第3个参数,调用Adapter的getItem方法获取对应位置的数据项,这个数据项就表示这个列表行对应的数据行。
这里给一个CursorAdapter的例子。举这么一个例子,是因为调用Adapter的getItem方法返回的是Object类型,如果是CursorAdapter的话,那么返回这个Object实际上是一个游标,也就是Cursor类型。
ListAdapter adapter = (ListAdapter) parent.getAdapter();
Object item = adapter.getItem(position);
Cursor cursor = (Cursor) item;
不过也有人并不按常理,比如有人在实现CursorAdapter的newView或者bindView方法的时候,将这个View的tag设置为对应的数据项,然后通过第2个参数view获取到对应的数据项。
@SuppressLint("AppCompatCustomView")
class TextItemView extends TextView {
public TextItemView(Context context) {
super(context);
}
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
super.onDraw(canvas);
paint.setColor(Color.BLACK);
canvas.drawLine(0, getHeight() - 1, getWidth(), getHeight() - 1, paint);
}
}
class Adapter extends ArrayAdapter<String> {
public Adapter(@NonNull Context context, int resource, @NonNull List<String> objects) {
super(context, resource, objects);
}
public View getView(int position, View convertView, ViewGroup parent) {
String s = getItem(position);
TextView textViewField;
LinearLayout itemLayoutView = (LinearLayout) convertView;
if (itemLayoutView == null) {
Log.d(getClass().getName(), "alloc view for " + position);
itemLayoutView = new LinearLayout(getContext());
LinearLayout.LayoutParams itemLayoutViewLayoutParams =
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
itemLayoutView.setLayoutParams(itemLayoutViewLayoutParams);
textViewField = new TextItemView(getContext());
textViewField.setTextColor(Color.BLACK);
LinearLayout.LayoutParams textViewFieldLayoutParams =
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
itemLayoutView.addView(textViewField, textViewFieldLayoutParams);
itemLayoutView.setTag(textViewField);
} else {
textViewField = (TextView) itemLayoutView.getTag();
}
textViewField.setText(s);
return itemLayoutView;
}
}
public class ListViewTest extends Activity {
private List<String> list = new ArrayList<>();
private Adapter adapter;
private int increment;
private void initList() {
list.add("手机");
list.add("笔记本");
list.add("相机");
list.add("小汽车");
list.add("液晶电视");
list.add("电冰箱");
list.add("空调");
list.add("冰箱");
list.add("台式机");
list.add("显示器");
list.add("投影仪");
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout contentLayoutView = new LinearLayout(this);
LinearLayout.LayoutParams contentLayoutViewLayoutParams =
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
contentLayoutView.setLayoutParams(contentLayoutViewLayoutParams);
contentLayoutView.setBackgroundColor(Color.WHITE);
setContentView(contentLayoutView);
initList();
adapter = new Adapter(this, 0, list);
ListView listView = new ListView(this);
listView.setAdapter(adapter);
LinearLayout.LayoutParams listViewLayoutParams =
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
contentLayoutView.addView(listView, listViewLayoutParams);
listView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
increment++;
list.add("新增"+increment+"项");
adapter.notifyDataSetChanged();
break;
}
return false;
}
});
}
}
ViewFlipper
NavigationBarView
ItemRippleColor
默认情况下,点击选择一个选项时,会有波纹效果。
如果想要去掉这个效果的话,可以设置为null。
mainNaviView.setItemRippleColor(null);
setOnNavigationItemSelectedListener
这个方法已经废弃了。
注册的监听器要实现BottomNavigationView.OnNavigationItemSelectedListener接口。
public interface OnNavigationItemSelectedListener extends OnItemSelectedListener {
}
setOnItemSelectedListener
注册的监听器要实现NavigationBarView.OnItemSelectedListener接口。
public interface OnItemSelectedListener {
/**
* Called when an item in the navigation menu is selected.
*
* @param item The selected item
* @return true to display the item as the selected item and false if the item should not be
* selected. Consider setting non-selectable items as disabled preemptively to make them
* appear non-interactive.
*/
boolean onNavigationItemSelected(@NonNull MenuItem item);
}
注意在实现onNavigationItemSelected方法的时候返回的true值。
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Log.d(this.getClass().getName(), "select " + item.getTitle());
return true;
}
Android Support Repository
Alert
publicclass Alert extends AlertDialog implements OnContentListener {
privatestaticfinalintRES = R.layout.alert;
private AlertDialog alert;
private TextView messageView;
private LinearLayout buttonBoxLayout;
public Alert(AlertDialog alert, Context context) {
super(context);
this.alert = alert;
}
@Override
publicvoid onContent(Window window) {
messageView = (TextView) window.findViewById(R.id.message);
buttonBoxLayout = (LinearLayout) window.findViewById(R.id.layout_button_box);
}
publicvoid setMessage(int resId) {
messageView.setText(resId);
}
publicvoid setMessage(String message) {
messageView.setText(message);
}
publicvoid setPositiveButton(String text, final View.OnClickListener listener) {
Context context = getContext();
TextView button = new TextView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
button.setLayoutParams(params);
button.setText(text);
button.setTextColor(Color.BLACK);
button.setTextSize(20);
button.setGravity(Gravity.CENTER);
button.setOnClickListener(listener);
buttonBoxLayout.addView(button);
}
publicvoid setNegativeButton(String text, final View.OnClickListener listener) {
Context context = getContext();
TextView button = new TextView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
button.setLayoutParams(params);
button.setText(text);
button.setTextColor(Color.BLACK);
button.setTextSize(20);
button.setGravity(Gravity.CENTER);
button.setOnClickListener(listener);
if(buttonBoxLayout.getChildCount() > 0) {
buttonBoxLayout.addView(button, 1);
} else {
button.setLayoutParams(params);
buttonBoxLayout.addView(button);
}
}
publicvoid show() {
show(RES, null);
}
publicvoid show(int res) {
show(res, null);
}
publicvoid show(int res, OnContentListener listener) {
alert.show();
Window window = alert.getWindow();
window.setContentView(res);
listener = listener == null ? this : listener;
listener.onContent(window);
}
publicvoid dismiss() {
alert.dismiss();
}
publicstaticclass Builder {
private AlertDialog.Builder innerBuilder;
public Builder(Context context) {
innerBuilder = new AlertDialog.Builder(context);
}
public Alert create() {
AlertDialog alert = innerBuilder.create();
Alert newalert = new Alert(alert, alert.getContext());
return newalert;
}
}
}
publicinterface OnContentListener {
publicvoid onContent(Window window);
}
final Alert alert = new Alert.Builder(activity).create();
alert.show();
alert.setMessage("请输入用户名");
alert.setPositiveButton("确定", new View.OnClickListener() {
@Override
publicvoid onClick(View v) {
alert.dismiss();
Toast.makeText(activity.getApplicationContext(), "被点到确定", Toast.LENGTH_LONG).show();
}
});
alert.setNegativeButton("取消", new View.OnClickListener() {
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
alert.dismiss();
Toast.makeText(activity.getApplicationContext(), "被点到取消", Toast.LENGTH_LONG).show();
}
});
AlertDialog dialog = new AlertDialog.Builder(activity).create();
final Alert alert = new Alert(dialog, activity);
alert.show();
alert.setMessage("请输入用户名");
alert.setPositiveButton("确定", new View.OnClickListener() {
@Override
publicvoid onClick(View v) {
alert.dismiss();
Toast.makeText(activity.getApplicationContext(), "被点到确定", Toast.LENGTH_LONG).show();
}
});
alert.setNegativeButton("取消", new View.OnClickListener() {
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
alert.dismiss();
Toast.makeText(activity.getApplicationContext(), "被点到取消", Toast.LENGTH_LONG).show();
}
});
Waiting
publicclass Waiting {
private Loading loading;
private Handler handler = null;
private OnActionListener callback;
public Waiting(Context context) {
loading = new Loading(context);
handler = new Handler();
}
publicvoid setCallback(OnActionListener callback) {
this.callback = callback;
}
publicvoid show() {
loading.show();
if (callback != null) {
handler.post(new Runnable() {
@Override
publicvoid run() {
callback.onAction();
}
});
}
}
}
Loading
publicclass Loading extends Dialog {
public Loading(Context context) {
super(context);
}
/* (non-Javadoc)
* @see android.app.Dialog#onCreate(android.os.Bundle)
*/
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Context context = getContext();
View view = LayoutInflater.from(context).inflate(R.layout.waiting, null);
ImageView waiting = (ImageView) view.findViewById(R.id.waiting_rotate_image);
Animation ani = AnimationUtils.loadAnimation(context, R.anim.waiting_rotate);
waiting.setAnimation(ani);
// waiting.setOnClickListener(new View.OnClickListener() {
//
// @Override
// public void onClick(View v) {
// dismiss();
// }
// });
setContentView(view);
}
}
GridView和GridLayout的区别
从名称上看GridView是一种视图,GridLayout是一种布局,它们都是容器视图。不过不管是布局还是容器什么的都是视图。向GridView中添加子视图的时候需要考虑子视图的布局设置。
修改C:\WINDOWS\inf\wpdmtp.inf:
[Generic.NTx86]
添加:
%GenericMTP.DeviceDesc%=MTP, USB\VID_12D1&PID_107F&MI_00
[Generic.NTamd64]
添加:
%GenericMTP.DeviceDesc%=MTP, USB\VID_12D1&PID_107F&MI_00
;
;Device is identified by Microsoft OS descriptor
;If your device does not support it, use specific VID & PID for identification
;
[Generic.NTx86]
%GenericMTP.DeviceDesc%=MTP, USB\MS_COMP_MTP
%GenericMTP.DeviceDesc%=MTP, USB\VID_12D1&PID_107F&MI_00
[Generic.NTamd64]
%GenericMTP.DeviceDesc%=MTP, USB\MS_COMP_MTP
%GenericMTP.DeviceDesc%=MTP, USB\VID_12D1&PID_107F&MI_00
相关推荐
在Android开发中,布局(Layout)是构建用户界面的基础元素,它定义了屏幕上各个组件的排列方式和相互关系。本文将深入探讨Android的五种主要布局:LinearLayout、RelativeLayout、FrameLayout、GridLayout以及...
在Android开发中,`Layout`起着至关重要的作用,它用于组织和排列用户界面中的各种视图(View)组件。通过使用不同的布局方式,开发者可以创建出灵活且适应不同屏幕尺寸的应用界面。本文将详细介绍与Android布局相关...
3. `android:layout_gravity`: 此属性用于设置视图相对于其父视图的位置,同样可以设置为`left`、`right`等。 4. `android:scaleType`: 该属性用于控制`ImageView`中图片的缩放方式,有`CENTER`、`CENTER_CROP`、`...
最后,还有其他一些属性,如`android:layoutAnimation`用于定义布局显示时的动画,`android:id`用于给视图分配唯一标识,便于查找和引用,`android:tag`则可以添加自定义标签方便查找和逻辑处理,以及`android:...
Android 程序技术 本节课程内容:Gallery 高级控件-画廊视图 高级控件-画廊视图 Advanced controls - Gallery view 画廊Gallery能够水平方向显示内容,并且可用手指直接拖动图片移动,一般用来浏览图片,被选中的...
- **区别**:与`android:gravity`不同,`layout_gravity`关注的是整个视图的位置,而非视图内部内容的位置。 - **示例**:`android:layout_gravity="right"` #### 5. `android:textSize` - **功能**:设置文本大小...
10. `android:layout_marginStart="dp_value"` 和 `android:layout_marginEnd="dp_value"`:设置视图与相邻视图或边缘的间距,支持RTL(Right-to-Left)布局。 三、`RelativeLayout`实例 下面是一个简单的`...
在Adapter中,根据数据集动态填充这些视图: ```java public class MultiItemAdapter extends BaseAdapter { // ... 其他Adapter方法 @Override public View getView(int position, View convertView, ...
`RelativeLayout` 是Android中非常常用的一种布局方式,它允许子视图相对于其他视图或者父容器定位。以下是一些常用的`RelativeLayout`属性: ##### 第一类:属性值为true或false - **android:layout_...
Android的相对布局(RelativeLayout)是Android开发中常用的一种布局方式,它允许子视图相对于其他视图或父视图进行定位。在这个文档中,我们将深入探讨RelativeLayout的基本属性及其使用。 一、属性值为true或...
Android 程序技术 本节课程内容:GridView 高级控件-网格视图 高级控件-网格视图 Advanced controls - Grid view GridView 跟ListView 很类似,Listview 主要以列表形式显示数据,GridView 则是以网格形式显示数据...
- `android:layout_margin`:用于设置视图与其他视图或边界之间的距离,有上、下、左、右四个方向的属性。 - `android:padding`:用于设置视图内部的空白区域,同样有四个方向的属性。 3. **实例解析**: 假设...
1. **`android:layout_above`**:使视图位于指定视图之上。 2. **`android:layout_below`**:使视图位于指定视图之下。 3. **`android:layout_toLeftOf`**:使视图位于指定视图左侧。 4. **`android:layout_...
本示例中的"android自定义视图 比例图"着重讲解如何创建一个由三部分组成的视图:中间的文字、文字周围的圆圈以及最外层的圆环。这种视图常用于展示数据的比例或进度,例如健康应用中的步数完成度、电量指示等。 ...
- **`android:layout_marginBottom`**、**`android:layout_marginLeft`**、**`android:layout_marginRight`** 和 **`android:layout_marginTop`**:这些属性接受一个像素值(例如 30dp),可以设置视图与其父容器或...
### Android视图组和布局详解 #### 一、Android的屏幕元素体系 在Android开发中,屏幕元素体系的构建基于视图(View)与视图组(ViewGroup)。视图组是一个特殊的视图,它的主要功能是容纳并管理一系列的子视图。...
- **android:padding** 属性用于设置视图内容与视图边缘之间的间距。 - **android:layout_margin** 属性则用于设置视图与周围视图或容器边缘之间的间距。 例如: ```xml android:layout_width="wrap_content" ...
- `android:layout_gravity`:设置视图相对于其父视图的位置,例如在`LinearLayout`中,可以将按钮设置为靠左或靠右。 7. `ImageView`的`android:scaleType`属性: - `CENTER`:保持原图尺寸居中显示,超出部分会...
- `android:layout_alignBaseline`: 视图的基线将与指定ID视图的基线对齐。 - `android:layout_alignBottom`: 视图的底部将与指定ID视图的底部对齐。 - `android:layout_alignTop`: 视图的顶部将与指定ID视图的...