活动(Activity)
活动是一种可以包含用户界面的组件
主要用于和用户进行交互
以下为添加了一个button的HelloWorld程序
public class login extends AppCompatActivity {
//继承自AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//最基本的,默认的onCreate()
//项目中任何活动都要重写Activity的onCreate()方法
setContentView(R.layout.activity_login);
//为活动加载一个布局
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.logintest.login">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/textView" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_below="@+id/textView"
android:layout_toRightOf="@+id/textView"
android:layout_toEndOf="@+id/textView" />
</RelativeLayout>
- android:id是给当前元素定义一个唯一的标识符
与在XML中引用资源的语法类似
用@+id/id_name的语法定义一个id
- android:layout_width指定宽度,wrap_content表示刚好包含,match_parent让当前元素和父元素一样属性
然后需要在AndroidManifest文件中注册
在<application>
标签内对活动使用<activity>
标签进行注册声明
android:name
活动名称android:lable
活动标题,显示在活动最顶部,会成为启动器(Launcher)中应用程序显示的名称- 若需隐藏,在
setContentView()
之前执行requestWindowFeature(Window.FEATURE_NO_TITLE)
语句
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
这段代码声明意为让此活动成为程序的主活动,即点击应用图标 首先打开的活动
补充:之前lable隐藏失败,百度后发现是Activity继承的不对
public class login extends AppCompatActivity
修改为继承自Activity即可
在活动中使用Toast
Toast是安卓系统提供的提醒方式,在程序使用中将短小的信息通知给用户,在一段时间后消失
以下为对button实现toast方法的示例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_login);
Button button1=(Button) findViewById(R.id.button);
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Toast.makeText(login.this,"You clicked Button",Toast.LENGTH_SHORT).show();
}
});
}
注意点
- 在AS中对Button需要指定(alt +Enter)为View.Button
- 一开始写的是
button1.setOnClickListener(new OnClickListener()
提示说onClickListener()有两个意项,指定为view.onClickListener() - 注意大小写
在活动中,可以通过findViewById()方法获取到在布局文件中定义的元素,这里传入R.id.button()来得到按钮的实例
findViewById()方法返回的是一个View对象,我们需要向下转型为Button对象(Button) findViewById(R.id.button);
通过调用setOnClickListener()方法为按钮注册一个监听器,点击按钮就会执行监听器的OnClick()方法,Toast就在其中实现
Toast用法
用静态方法makeTest()创建一个Toast对象,然后调用show()显示
makeTest()有三个参数
Context
为Toast要求的上下文
这里活动本身就是一个Context对象,因此直接传入login.thisToast显示的文本内容
- Toast显示的时长
内置常量可选择
Toast.LENGTH_SHORT
和Toast.LENGTH_LONG
在活动中使用Menu
File->New->android resource file resource type:menu 修改代码<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
这里创建了两个菜单项,``标签用来创建具体的一个菜单项 android:id 指定唯一标识符 android:title指定菜单项名称 在Activity(此处为login中重写onCreateOptionMenu()
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.amenu,menu);
return true;
}
这里getMenuInflater()方法可以得到MenuInflater对象,然后调用inflate()方法就可以给当前活动创建菜单.
inflate()接受两个参数显示出来
- 第一个参数用于指定我们通过哪一个资源文件创建菜单,这里传入R.menu.main
- 第二个参数用于指定我们菜单项将添加到哪个Menu对象中,这里使用onCreateOptionMenu()方法中传入的menu参数,然后返回true,表示允许创建的菜单显示出来,false则无法显示
关于inflater()
通俗的说,inflate就相当于将一个xml中定义的布局找出来.
因为在一个Activity里如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组件.
因此如果你的Activity里如果用到别的layout,比如对话框上的layout,你还要设置对话框上的layout里的组件(像图片ImageView,文字TextView)上的内容,你就必须用inflate()先将对话框上的layout找出来,然后再用这个layout对象去找到它上面的组件,如:
Viewview=View.inflate(this,R.layout.dialog_layout,null);
TextViewdialogTV=(TextView)view.findViewById(R.id.dialog_tv);
dialogTV.setText("abcd");
如果组件R.id.dialog_tv是对话框上的组件,而你直接用this.findViewById(R.id.dialog_tv)肯定会报错.
三种方式可以生成LayoutInflater:
LayoutInflaterinflater=LayoutInflater.from(this);
LayoutInflaterinflater=getLayoutInflater();
LayoutInflaterinflater=(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
然后调用inflate方法将xml布局文件转成View
publicViewinflate(intresource,ViewGrouproot,booleanattachToRoot)
在View类中,也有inflate方法
publicstaticViewinflate(Contextcontext,intresource,ViewGrouproot)
转自安卓中文网
定义菜单响应事件
在Activity(此处为login)中重写onOptionsItemSelected()方法
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case R.id.add_item:
Toast.makeText(this,"You clicked Add",Toast.LENGTH_SHORT);
break;
case R.id.remove_item:
Toast.makeText(this,"You clicked Remove",Toast.LENGTH_SHORT);
break;
default:
}
return true;
}
在此方法中,调用item.getItemId()来判断点击哪个菜单项,
在按下menu键的时候显示开始菜单
销毁一个活动
按一下back键就可以销毁当前活动,当然也可以通过代码销毁
在活动中调用finish()方法即可,效果和back一样.
补充:血的教训
写程序一定要注意细节
之前onCreatOptionMenu
写错create少了个e,options少了s,出现错误