`
lobin
  • 浏览: 380073 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android: 视图

 
阅读更多

视图

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

 

TextView textViewField = new TextView(this);
textViewField.setText("Hello, World!");

contentLayoutView.addView(textViewField);

字体

 

字体大小

调用setTextSize方法设置字体大小。这个方法有两种形式,一种是直接设置字体大小,单位为像素,这个像素并不是我们所理解的像素,而是一种“scaled pixel”;另一种在指定字体大小时,还可以指定字体大小的单位度量。

 

    public void setTextSize(float size) {
        setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
    }
 

 

 

    public void setTextSize(int unit, float size) {
        if (!isAutoSizeEnabled()) {
            setTextSizeInternal(unit, size, true /* shouldRequestLayout */);
        }
    }
 

 

单位度量可以查看TypedValue中的定义。

 

    /** {@link #TYPE_DIMENSION} complex unit: Value is raw pixels. */
    public static final int COMPLEX_UNIT_PX = 0;
    /** {@link #TYPE_DIMENSION} complex unit: Value is Device Independent
     *  Pixels. */
    public static final int COMPLEX_UNIT_DIP = 1;
    /** {@link #TYPE_DIMENSION} complex unit: Value is a scaled pixel. */
    public static final int COMPLEX_UNIT_SP = 2;
    /** {@link #TYPE_DIMENSION} complex unit: Value is in points. */
    public static final int COMPLEX_UNIT_PT = 3;
    /** {@link #TYPE_DIMENSION} complex unit: Value is in inches. */
    public static final int COMPLEX_UNIT_IN = 4;
    /** {@link #TYPE_DIMENSION} complex unit: Value is in millimeters. */
    public static final int COMPLEX_UNIT_MM = 5;
可编辑状态
TextView默认是不可编辑的,可以通过设置android:editable属性使之进入可编辑状态,该属性默认为false,即不可编辑状态,如果设置为true,将进入可编辑状态。对于TextView,该属性已废弃。
通过设置android:inputType属性也可以使TextView进入可编辑状态。
由于TextView的android:editable属性已废弃,Android的建议是使用EditText,或者android:inputType属性代替。
和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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics