属性 | 释义 | 值 |
android:layout_width | 宽度(所有控件都有) | match_parent:当前控件大小与父布局一致 fill_parent:同match_parent一样,官方推荐match_parent wrap_content:当前控件大小正好能包含内容(由内容来决定) |
android:layout_height | 高度 (所有控件都有) | 同上 |
android:gravity | 文字对齐方式 | top、bottom、left、right、center等 , 可 以 用 “ | ” 来 同 时 指 定 多 个 值 |
android:textSize | 文字大小 | - |
android:textColor | 文字颜色 | - |
属性 | 释义 | 值 |
android:hint | 输入框的提示信息(相当于H5的placeholder) | - |
android:maxLines | 指定最大行数 | 数字 |
属性 | 释义 | 值 |
android:src | 指定图片 | - |
imageView.setImageResource(R.drawable.test);
属性 | 释义 | 值 |
android:visibility | 控件是否可见(所有控件都有) | visible:可见,默认值 invisible:不可见,但仍然占据原来的位置和大小(可理解为透明) gone:不仅不可见,而且不占用原有任何空间 |
android:max | 在给进度条添加如下属性的时候: style="?android:attr/progressBarStyleHorizontal", 该进度条就成了一个水平进度条。 此时设置此max属性表示最大值为多少,比如100 |
- |
//设置可见性,还有View.GONE、View.INVISIBLE
progressBar.setVisibility(View.VISIBLE);
//设置进度
progressBar.setProgress(60);
/**
* 1.首先通过AlertDialog.Builder来创建一个AlertDialog实例
* 2.然后设置标题、内容、可否取消等属性
* 3. setPositiveButton()方法为对话框确定按钮设置文本以及事件
* 4. setNegativeButton()方法则为取消按钮设置文本及事件
*/
AlertDialog.Builder dialog=new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("This is a dialog");
dialog.setMessage("Some thing want to show");
dialog.setCancelable(false);
dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
/**
* 1.先创建一个ProgressDialog对象
* 2.同样设置标题、内容、是否可取消
* 3.设置setCancelable(false)后则不能按Back键关闭对话框
*/
ProgressDialog dialog=new ProgressDialog(MainActivity.this);
dialog.setTitle("This is a progress dialog");
dialog.setMessage("Please Loading ....");
dialog.setCancelable(false);
dialog.show();
//可以调用此方法来关闭对话框
//dialog.dismiss();
属性 | 释义 | 值 |
android:orientation | 线性排列方向 | horizontal(水平方向)、vertical(垂直方向) |
android:layout_gravity | 控件在布局中的对齐方式 | 注意:当布局方向为horizontal时,只有垂直方向的对齐方式起作用 同理,当为vertical时,只有水平方向的起作用。 |
android:layout_weight | 使用比例来指定控件大小 | 比如一共有2个控件,一个设为3,另一个设为2,则第一个占3/5,第二个占2/5; 同理如果两个都想占一半,则每个设为1即可,即1/2 |
属性 | 释义 | 值 |
android:layout_alignParentLeft | 相对父布局向左 | true、false |
android:layout_alignParentTop | 相对父布局向上 | true、false |
android:layout_alignParentRight | 相对父布局向右 | true、false |
android:layout_alignParentBottom | 相对父布局向下 | true、false |
android:layout_centerInParent | 相对父布局居中 | true、false |
android:layout_above | 让控件位于另一个控件上方,注意!该控件需要定义在另一个控件 后面,下同 |
需要指定参考的控件id引用,如:@id/button1 |
android:layout_below | 让控件位于另一个控件下方 | 同上 |
android:layout_toLeftOf | 让控件位于另一个控件左侧 | 同上 |
android:layout_toRightOf | 让控件位于另一个控件右侧 | 同上 |
android:layout_alignLeft | 让控件左边缘和另一个控件左边缘对齐 | 控件id的引用 |
android:layout_alignRight | 让控件右边缘和另一个控件右边缘对齐 | 同上 |
android:layout_alignTop | 让控件上边缘和另一个控件上边缘对齐 | 同上 |
android:layout_alignBottom | 让控件下边缘和另一个控件下边缘对齐 | 同上 |
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 窗口无标题(别忘了继承自Activity才起作用)
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
}
package com.jastar.uicustomviews.layout;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import com.jastar.uicustomviews.R;
public class TitleLayout extends LinearLayout {
/**
* 重写带有两个参数的构造函数,在布局中引入TitleLayout就会调用这个函数
*
* @param context
* @param attrs
*/
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
/**
* 1.通过LayoutInflater.from()方法构造一个LayoutInflater对象
* 2.通过该对象的inflate()来动态加载title.xml布局
* 3.inflater(要加载的布局文件id,给加载好的布局再指定一个父布局这里使用TitleLayout)
*/
LayoutInflater.from(context).inflate(R.layout.title, this);
}
}
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
/**
* 1.通过LayoutInflater.from()方法构造一个LayoutInflater对象
* 2.通过该对象的inflate()来动态加载title.xml布局
* 3.inflater(要加载的布局文件id,给加载好的布局再指定一个父布局这里使用TitleLayout)
*/
LayoutInflater.from(context).inflate(R.layout.title, this);
//同样获取到按钮对象
Button btnBack = (Button) this.findViewById(R.id.title_back);
Button btnEdit = (Button) this.findViewById(R.id.title_edit);
btnBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//返回按钮销毁当前活动
((Activity) getContext()).finish();
}
});
btnEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "您点击了编辑按钮", Toast.LENGTH_SHORT).show();
}
});
}
package com.jastar.listviewtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
/**
* ListView的数据是需要提前准备好的,无论是从数据库读的还是从哪里来的;这里模拟一些数据
*/
private String[] data = {"Apple", "Banana", "Orange", "Watermelon", "Pear", "Grap", "Pineapple", "Strawberry", "Cherry", "Mango"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 1.Android中的数组是无法直接传递给ListView的,需要借助适配器Adapter来实现
* 2.ArrayAdapter还算是比较好用的,可以指定泛型
* 3.构造函数需要参数,不同场景应该使用不同的构造函数,此处的参数依次为:
* param1:当前上下文
* param2:ListView子项布局id,这是一个安卓内置的子项布局文件,里面只有一个TextView,简单显示文本即可
* param3:要适配的数据
*/
ArrayAdapter adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, data);
ListView listView = (ListView) findViewById(R.id.list_view);
//调用setAdapter方法,将适配器传入
listView.setAdapter(adapter);
}
}
package com.jastar.listviewtest.Adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.jastar.listviewtest.Entity.Fruit;
import java.util.List;
public class FruitAdapter extends ArrayAdapter {
private int resourceId;
/**
* 重写父类构造方法,用于将上下文、ListView、子项布局的id和数据都传递进来
*
* @param context 上下文
* @param textViewResourceId 子项布局Id
* @param objects 数据
*/
public FruitAdapter(Context context, int textViewResourceId, List objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
/**
* 1.重写getView方法,该方法在每个子项被滚动到屏幕内的时候调用
*
* @param position
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//通过getItem()获取当前项的实例
Fruit fruit = getItem(position);
//使用LayoutInflater将该子项加载到我们传入的布局
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
//获取子项布局中的控件
ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化水果数据,模拟假数据
initFruitList();
FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
ListView view = (ListView) findViewById(R.id.list_view);
view.setAdapter(adapter);
}
private void initFruitList() {
Fruit apple = new Fruit("Apple", R.drawable.fruit_apple_pic);
fruitList.add(apple);
//....
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//...
view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
Fruit fruit = fruitList.get(position);
Toast.makeText(MainActivity.this, "name:" + fruit.getName() + ",imageid:" + fruit.getImageId(), Toast.LENGTH_SHORT).show();
}
});
}