Android基础(三)

活动(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.this

  • Toast显示的文本内容

  • Toast显示的时长

    内置常量可选择Toast.LENGTH_SHORTToast.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,出现错误

猜你喜欢

转载自blog.csdn.net/Jacob_Zheng/article/details/51933383