一、xml文件的一些概述
在Android中,xml文件一般用于记录数值、总体设置和设置页面布局。最主要的用途就是设置页面布局。一个activity如果想要展示在用户的面前。没有一个适当的布局是无法完成的。而布局的好坏则直接影响着应用的美观。从今天开始,就让我们说一说布局文件和布局文件中的各个组件。
1.xml文件与Java文件的互联
不管是什么程序,它总是开始于Main。Android也是这样,Android一般开始于Java文件MainActivity。(改变开始的activity只需要改变AndroidManifest.xml文件中的语句所在位置即可)
那么首先让我们首先看一下在我们新建完工程后我们所得到的文件代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//读取现有的存储。
setContentView(R.layout.activity_main);//启动视图activity_main
}
}
第一句是用于读取应用上一次关闭时的存储的数据的,我们这里可以姑且不用去管他。而第二行setContentView,直译就是建立目录视图R.layout.activity_main。通过这个函数,我们就可以把视图文件activity_main.xml交给这个Java文件,使其运行。
这里的R.layout.activity_main是说res文件夹下layout文件夹中的activity_main.xml。R即是res。
将布局文件与Java文件连接之后,我们就可以在Java文件中对xml文件中的各个组件进行操作了。在这里,我们以登陆界面的文件获取为例。
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
findViewById(R.id.loginsystem).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText mUsername =(EditText)findViewById(R.id.username);
EditText mpassword =(EditText)findViewById(R.id.password);
String Username=mUsername.getText().toString();
String password=mpassword.getText().toString();
if(Username.equalsIgnoreCase("root")&&password.equals("123456")){
Toast.makeText(getApplicationContext(),"登陆成功",Toast.LENGTH_SHORT).show();
}
else Toast.makeText(Login.this,"您的用户名或密码错误",Toast.LENGTH_LONG).show();
}
});
}
要操作一个组件,首先我们需要的是让计算机找到她,就像在晚会中找到要放盘子的桌子一样,通过findViewById()函数来找到相应的组件的id。这里的查找方式和上面的找视图是一个原理,不同的是,id是放在专门的文件中的,不在工作空间中直接显示,在这里的代码的第一行找到的id是在布局文件中的一个按钮,在它之后,我们需要设置一个监听器来进行(不知道什么是监听器的同学回去看一下Java的GUI就明白了)。与按钮一样EditText也是使用findViewById()函数来找到他,然后我们就可以使用getText()函数来获得其中的东西,不过getText返回的是一个Editable类型的值,要换成字符串,我们还需要调用toString进行类型转换。之后就可以进行账户密码的比对等等操作了。
2.布局文件的五大布局
布局是组件的排列方式,布局与组件之间大多数是被继承与继承关系。因此他们常常有共同的属性。
看晕了?那么简单点说,包括布局与各个控件在内,都是继承自view类。因此,他们都有一些共同的参数。布局,可以说是一个大一点的控件。
- FrameLayout
- Framelayout是Android中最简单的一种布局方式。其内部的view都是从屏幕左上角开始堆放,如果有多个view,后一个view的可见区域将遮挡前一个view相应区域。可以简单的理解成墙角堆放积木的效果。若想达到不遮挡前一view,可以通过对view设置layout_gravity进行简单定位。
- LinearLayout
- LinearLayout即线性布局,就是一个挨着一个。默认为水平方向的线性布局方式。
- android:orientation:设定其属性值来确定是水平还是垂直布局。
- android:weight:表示在相应方向上剩余空间的比重。如水平方向布局设置了android:weight,则android:width属性值建议设置成0dp,以取得更好的性能效果。优先级高于view本身相应方向上的长度。
- 对于水平线性布局而言,android:layout_gravity在水平方向上失效;对于垂直线性布局而言,android:layout_gravity在垂直方向上失效。
- RelativeLayout
- RelativeLayout是Android中相对最灵活的一种布局方式。主要可以设置与父控件的对齐方式和相对于其他控件的对其方式。通过灵活设置不同的对齐属性,可以达到复杂的布局效果,但前提是view需要具有相应的android:id=”@+id/viewid”。
- android:layout_above:将该控件的底部置于给定ID的控件之上;
- android:layout_below:将该控件的底部置于给定ID的控件之下;
- android:layout_toLeftOf:将该控件的右边缘与给定ID的控件左边缘对齐;
- android:layout_toRightOf:将该控件的左边缘与给定ID的控件右边缘对齐;
- android:layout_alignBaseline:将该控件的baseline与给定ID的baseline对齐;
- android:layout_alignTop:将该控件的顶部边缘与给定ID的顶部边缘对齐;
- android:layout_alignBottom:将该控件的底部边缘与给定ID的底部边缘对齐;
- android:layout_alignLeft:将该控件的左边缘与给定ID的左边缘对齐;
- android:layout_alignRight:将该控件的右边缘与给定ID的右边缘对齐;
- android:layout_alignParentTop:如果为true,将该控件的顶部与其父控件的顶部对齐;
- android:layout_alignParentBottom:如果为true,将该控件的底部与其父控件的底部对齐;
- android:layout_alignParentLeft:如果为true,将该控件的左部与其父控件的左部对齐;
- android:layout_alignParentRight:如果为true,将该控件的右部与其父控件的右部对齐;
- android:layout_centerHorizontal:如果为true,将该控件的置于水平居中;
- android:layout_centerVertical:如果为true,将该控件的置于垂直居中;
- android:layout_centerInParent:如果为true,将该控件的置于父控件的中央;
- android:layout_marginTop:上偏移的值;
- android:layout_marginBottom:下偏移的值;
- android:layout_marginLeft:左偏移的值;
- android:layout_marginRight:右偏移的值;
- TableLayout
- TableLayout即表格布局。使用TableLayout时需要注意以下几点:
- TbaleLayout类似于Html中的table,但是默认行列式没有边框的;
- TableLayout是LinearLayout的子类,因为可以对其中的view使用android:weight属性;
- Tablelayout的children不一定是TableRow,也可以直接是其他的view。行列也不像html中的table那样具有明显的对其模式;
- TableLayout中的children无需指定宽度,宽度默认都是match_parent。为其指定其他宽度值都是无效的;
- TableLayout中的children如果为TableRow,则无需为其指定高度,高度默认都是wrap_content。为其指定其他高度都是无效的,若children为其他view,则可以指定其他宽度值;
- TableLayout的属性android:collapseColumns设置隐藏,但是只针对child为tablerow有效;
- tablelayout的属性android:stretchColumns设置可拉伸列,android:shrinkColumns 设置可收缩列,优先级都是大于weight属性。
- AbsoluteLayout
- AbsoluteLayout即绝对布局(坐标布局),是相对于父控件的左上角开始的布局方式。通过给AbsoluteLayout中的view设置android:layout_x和android:layout_y属性值来确定此view本身左上角的位置,以此完成定位。
3.listview控件的创建和使用
Android里为我们提供了形形色色的各种控件,由于种类纷繁复杂,这里就不一一详述。我们选取所有控件中相对重要的listview进行讲解。
1/在xml中布置listview和在Java中用findViewById找到它
2/找到后为其设定适配器
ListView carmessage= (ListView) findViewById(R.id.listview);
carmessage.setAdapter(new Listview_Carmessage(MainActivity.this));
3/自主编写Adapter(也可使用现有)
public class Listview_Carmessage extends BaseAdapter {
private Context mContext;
private LayoutInflater mLayoutInflater;
private String[] mNames = {"小明", "小花"};
public Listview_Carmessage(Context context) {
mContext = context;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// 有多少条数据
return mNames.length;
}
@Override
public Object getItem(int position) {
// 返回某一条数据对象
return mNames[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 返回一个视图
convertView = mLayoutInflater.inflate(R.layout.item_Listview_Carmessage, null);//找到这个视图
TextView nameTextView = (TextView) convertView.findViewById(R.id.name_text_view);//注意需要先写convert
nameTextView.setText(mNames[position]);
return convertView;
}
}
listview是每运行一个item就读取一次这个文件,position是这此读取的数据号,convertView是视图。
在这个类中,我们有两个新的对象类型 context 上下文和LayoutInflater。