Android期末复习

来源:互联网 发布:毛坦厂的日与夜 知乎 编辑:程序博客网 时间:2024/05/21 21:42


题型:
选择题:10
填空题:10
简答题:6
代码题:1

简答题:
猜测: (Button创建事件。访问相机权限。注册界面 )

1.安卓的创建与版本(火锅,烤串,233333333)
Android 1.5(Cupcake 纸杯蛋糕)
Android 1.6(Donut甜甜圈)
Android 2.0(Eclair松饼)
Android 2.2(Froyo冻酸奶)
Android 2.3(Gingerbread姜饼)
Android 3.0(Honeycomb蜂巢)
Android 4.0(Ice Cream Sandwich冰淇淋三明治)
Google发布Android 4.1(JellyBean 果冻豆)
Android 4.4(奇巧Kitkat)
Android 5.0(棒棒糖Lollipop)
Android 6.0(棉花糖Marshmallow)
Android 7.0(牛轧糖Nougat)
Android 8.0(奥利奥Oreo)

2.res文件夹:
放在drawable的内容有看得见的文件夹与看不见的,里面能放xml文件动态画图片与图片。
values放的是我们要引用的内容的变量,主要是字符串等。
layout文件夹放的是布局文件。还有一些看不到但可以自己创建的。
什么样的文件要放在什么样的文件夹下,不能乱放

3.创建活动,创建Activity,默认会自动继承父类:AppCompatActivity

public class MainLayoutActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main_layout);    }}

4.图片的轮播界面(简答题可能,书上第三章内容)。

工具:ViewPage

5.各个布局以及他的中文:(填空题可能,书上第三章)

LinearLayout,线性布局
RelativeLayout,相对布局
DrawerLayout,抽屉布局
CoordinateLayout,九宫格布局
FrameLayout,帧布局
PercentFrameLayout,PercentRelativeLayout,百分比布局

(1).对于RelativeLayout布局:
他可以通过相对定位的方式让空间出现在布局的任何位置。实践起来都相对比较简单:

  <Button        android:id="@+id/Button2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@id/Button3"        android:layout_toLeftOf="@id/Button3"        android:text="Button2"/>    <Button        android:id="@+id/Button4"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_alignParentLeft="true"        android:text="Button4"        />    <Button        android:id="@+id/Button5"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_alignParentBottom= "true"        android:text="Button5"        />

都是一些关于方位的,比较简单。

对于后面两种不均用的少,不介绍了。

6.对话框的使用,(和Toast不一样),好好看一下

三个控件分别为:

PositiveButton
NegativeButton
NeuralButton

实践:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Button button = (Button)findViewById(R.id.ButtonOne);    button.setOnClickListener(new View.OnClickListener(){        @Override        public void onClick(View view){            AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);            dialog.setTitle("This is a AlertDialog");            dialog.setMessage("Something important");            dialog.setCancelable(false);            dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {                @Override                public void onClick(DialogInterface dialogInterface, int i) {                    Toast.makeText(MainActivity.this,"This is a PositiveButton",Toast.LENGTH_SHORT).show();                }            });            dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {                @Override                public void onClick(DialogInterface dialogInterface, int i) {                    Toast.makeText(MainActivity.this,"This is a NegativeButton",Toast.LENGTH_SHORT).show();                }            });            dialog.setNeutralButton("else", new DialogInterface.OnClickListener() {                @Override                public void onClick(DialogInterface dialogInterface, int i) {                    Toast.makeText(MainActivity.this,"This is a NeutralButton",Toast.LENGTH_SHORT).show();                }            });            dialog.show();        }    });}

}
7.安卓跨平台使用的虚拟机是 ,ART(Android run time),不是JVM,用空间来换取时间
5.0版开始以Android Runtime(ART)取代Dalvik虚拟机,从没用过JVM。

8.Android版本的使用。
小米等主要支持的是Android 4.4(奇巧Kitkat)
Android8.0这类主要是亲儿子系列:
Nokia 旗下的 Nokia 6、Nokia 5、Nokia 3
Motorola 表示會為旗艦機種提供升級
Sony也已经出现了升级

9.控件的使用,旋转跳跃,processBar,TextView,inputView,哪些不是控件?
常见控件的使用:
(1).TestView

主要用于在界面上显示一段文本信息。
常见使用:

<TextView    android:id="@+id/TestView_One"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="@string/TestView_One"/>

这会只在界面左边显示文本。自然也能添加其他内容:

    android:gravity="center"<!-- 文本内容居中 -->    android:textSize="24sp"<!-- 设置文本字体大小为24sp -->    android:textColor="#0000ff"<!-- 设置颜色为0000ff蓝色 -->

(2).Button

用于和用户交互的重要控件,可配置的属性和TestView差不多。
常见使用:

<Button    android:id="@+id/Button_One"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="Button"    />

会发现虽然是text文本是Button,但是显示的是BUTTON,这是因为系统会对Button中的所有英文字目进行大写转换,如若不想要,添加一句:

            android:textAllCaps="false"<!--取消大写转换-->

也可以对Button对应的点击事件注册一个监听器:(在对应的活动中添加)

 //添加Button监听器:(添加在对应的Activity中)    Button button1 = (Button)findViewById(R.id.Button_One);    button1.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View view) {            //干脆创建一个Toast            Toast.makeText(MainLayoutActivity.this,"you clicked button1",Toast.LENGTH_SHORT).show();        }    });

(3).EditView

它允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理。
常见使用:

     <EditText            android:id="@+id/EditText_One"            android:layout_width="match_parent"            android:layout_height="wrap_content"            />

如果想在输入框中添加提示语,加入语句:

    android:hint="@string/EditText_Hint"

指定EditText的最大行数

    android:maxLines="2"<!--指定最大行数为两行-->

结合Button和EditText来完成一些功能,比如点击按钮来获得EditText中输入的内容:

  //Button2获得EditText的文本内容        Button button2 = (Button)findViewById(R.id.Button_Two);        final EditText editText = (EditText)findViewById(R.id.EditText_One);//定义一个EditText实例        button2.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View view) {                switch (view.getId()){                    case R.id.Button_Two:                        String inputText = editText.getText().toString();//getText()方法得到文本内容,然后toString()方法转化成字符串。                        Toast.makeText(MainLayoutActivity.this,inputText,Toast.LENGTH_SHORT).show();//Toast来把文本内容显示出来                        break;                    default:                }            }        });

(4).ImageView:

ImageView主要是用于在界面上展示图片的一个控件,而这些图片主要是放在res文件下的drawable文件夹下。
常见使用:

<ImageView        android:id="@+id/image_view_one"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/img"        />

(5).ProgressBar:

ProgressBar用于在界面上显示一个进度条,表示我们的程序正在加载一些数据。
常见用法

   <ProgressBar        android:id="@+id/ProcessBar_One"        android:layout_width="match_parent"        android:layout_height="wrap_content" />

结合Button使点击Button后进度条消失:

//Button4 取消progressBar        Button button4 = (Button)findViewById(R.id.Button_Four);        progressBar=(ProgressBar)findViewById(R.id.ProcessBar_One);        button4.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                switch (view.getId()){                    case R.id.Button_Four:                        if(progressBar.getVisibility() == View.GONE){                            progressBar.setVisibility(View.VISIBLE);                        }else{                            progressBar.setVisibility(View.GONE);                        }                        break;                    default:                        break;                }            }        });

第二种进度条:

   Button button2 = (Button)findViewById(R.id.ButtonTwo);    progressBar = (ProgressBar)findViewById(R.id.progressBar);    button2.setOnClickListener(new View.OnClickListener(){        @Override        public void onClick(View view){            int progress = progressBar.getProgress();            progress += 10;            progressBar.setProgress(progress);        }    });

(6).AlertDialog:

AlterDialog可以在当前的界面弹出一个对话框,这个对话框是指定于所有界面元素之上的,能够屏蔽掉其他控件的能力,
因此AlterDialog是用于提示一些非常重要的内容或者警告信息。

(7).ProgressDialog

ProgressDialog和AlterDialog有点类似,都可以在界面上弹出一个对话框,能够屏蔽掉其他控件的交互功能,不同的是,
ProgressDialog会在对话空中显示一个进度条,一般用于当前操作比较耗时,让用户耐心等待。

10.页面之间的跳转,显式与隐式,区别与使用,显式的缺点:其他程序与数据不知道页面就跳不过去。(哪些说法是错误的)
通过两个Button按件来讲述显式与隐式
10.1.Button按件创建活动:
1.先创建两个按件:
2.创建两个活动:SecondActivity和ThirdActivity:
首先还是从头再来创建全空类型的Activity即不勾选Generate layout file来自己配置
3.然后创建两个布局文件:second_layout和third_layout
然后在相应的Activity中添加代码来加入布局:

    setContentView(R.layout.second_layout);//SecondActivity中    setContentView(R.layout.third_layout);//ThirdActivity中

4.在MainLayoutActivity的onCreate()函数中创建两个按件的活动:

 Button button1 = (Button) findViewById(R.id.button);        button1.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View view) {                Intent intent = new Intent(MainLayoutActivity.this,SecondActivity.class);                startActivity(intent);            }        }); Button button2 = (Button)findViewById(R.id.button2);         button2.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 Intent intent = new Intent("com.example.review.ACTION_START");                 intent.addCategory("com.example.review.secondActivity");                 startActivity(intent);             }         });

5.配置AndroidManifest.xml文件:
在标签中添加内容:

  <activity android:name=".ThirdActivity">            <intent-filter>                <action android:name="com.example.review.ACTION_START" />                <category android:name="android.intent.category.DEFAULT" />                <category android:name="com.example.review.secondActivity" />            </intent-filter>        </activity>

10.2 Intent
显式Intent:
就直接新建一个intent,两个参数,一个是当前活动的页面,另一个是需要转向的页面的类,然后执行:

Intent intent = new Intent(MainLayoutActivity.this,SecondActivity.class);startActivity(intent);

隐式Intent:
新建一个intent,但是需要配置标签和,标签:

/*当前页面*/Intent intent = new Intent("com.example.review.ACTION_START");//这个必须和<action>标签内容相同intent.addCategory("com.example.review.secondActivity");//这个必须和<category>标签内容相同startActivity(intent);/*MainLayoutActivity页面*/<activity android:name=".ThirdActivity">            <intent-filter>                <action android:name="com.example.review.ACTION_START" /><!--和intent参数相同-->                <category android:name="android.intent.category.DEFAULT" /><!--先添加一个默认,不能少,否则会崩-->                <category android:name="com.example.review.secondActivity" /><!--在田间一个category,和其他好区别-->            </intent-filter></activity>

11.安卓的活动周期:onCreate,onStart,onPause,onStop,onReStart,onFinish的含义与调用。
体验活动的生命周期:

onCreate():创建活动,每新建一个活动,肯定会先先调用这个函数。
onStart():开始运行活动,一开始运行活动这个函数也会被调用。
onResume():继续运行活动,一开始运行活动这个函数也会被调用。
onPause(): 暂停活动,当你进入下一个活动时会调用(全挡住了之前活动和半挡住都会运行)。
onStop():停止活动,进入下一个活动时会调用(只有全挡住才会运行)。
onRestart():重新开始活动,从另一个会动回来时会调用。(对方是半挡住自己是不调用)
onDestroy():这个活动出栈时调用。

12.安卓访问数据库。(重点)
我们是使用SQLiteOpenHelper帮助类来创建数据库,现在来进行了解:

SQLiteOpenHelper是一个抽象类,所以想要使用它时,我们必须创建一个自己的类来继承它。
SQLiteOpenHelper有两个抽象方法,分别是:onCreate()和onUpgrate(),必须在类里面重写这两个方法,分别在其中去实现创建和升级数据库。
SQLiteOpenHelper来有两个重要的实例方法:getReadableDatabase()和getWritableDatabase()方法,两个都能可以创建和打开一个数据库,但是如果不可写入的时候,那就只能使用getReadableDatabase()。
SQLiteOpenHelper有两个构造方法要写,但是我们往往写带参数少的那个。但还是有四个(神他妈少。。):
第一个是Context,必须有他才能对数据库进行操作,第二个是数据库名称,第三个是允许我们在查询数据的时候返回的Cursor,一般都是传入null,第四个是数据库版本号。
这样构建出SQLiteOpenHelper实例后再调用他的getReadableDatabase()或者和getWritableDatabase()方法就能创建数据库了。

(1).新建一个MyDatabaseHelper()类来继承SQLiteOpenHelper:

    public class MyDatabaseHelper extends SQLiteOpenHelper {     //创建数据库语句     public static final String CREATE_BOOK = "create table book ("        + "id integer primary key autoincrement,"        + "author text,"        + "price real,"        + "pages integer"        + "name text)";     private Context mContext;     public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){         super(context,name,factory,version);         mContext = context;     }     @Override     public void onCreate(SQLiteDatabase db) {         db.execSQL(CREATE_BOOK);         Toast.makeText(mContext,"create success",Toast.LENGTH_SHORT).show();     }     @Override     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {     } }

在onCreate()方法中有调用了SQLiteDatabase的execSQL()方法去执行这条件表语句,并弹出一条Toast语句来做提示。

(2).添加一个Button来实现点击创建数据库

<!--activity_main.xml--><Button        android:id="@+id/create_database"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textAllCaps="false"        android:text="@string/create_database"/>

(3).在主活动中添加代码实现创建:

public class MainActivity extends AppCompatActivity {    private MyDatabaseHelper dbHlper;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //参数将数据库名称指定为BoolStore.db,版本号指定为1。        dbHlper = new MyDatabaseHelper(this,"BookStore.db",null,1);        Button createDatabase = (Button)findViewById(R.id.create_database);        createDatabase.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                dbHlper.getWritableDatabase();            }        });    }}

MyDatabaseHelper中的getReadableDatabase()和getWritableDatabase()方法能够返回一个SQLiteDatabase对象,借助此对象能实现增删改查的功能

(4).添加数据:

SQLiteDatabase中提供了一个insert()方法来进行添加数据,他接收三个参数,
一个是需要添加数据的表名,第二个参数用于在没指定添加数据的情况下给某些可为空的列自动赋值NULL,一般用不到,直接传入null,
第三个参数是一个ContentValues对象,提供了一系列的put()方法重构,用于向ContentValues中添加数据,只需要将表中的,每个列名以及相应的待添加数据传入即可。
实现一下:

 <!--activity_main.xml--> <Button        android:id="@+id/add_data"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textAllCaps="false"        android:text="@string/add_data"/> //MainActivity.java Button button2 = (Button)findViewById(R.id.add_data);        button2.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View view){                SQLiteDatabase db = dbHlper.getReadableDatabase();                ContentValues values = new ContentValues();                //开始添加第一条数据                values.put("name","Python learning");                values.put("author","David");                values.put("page","856");                values.put("price","56");                db.insert("Book",null,values);                //第二条                values.put("name","Java");                values.put("author","Ross");                values.put("page","654");                values.put("price","42");                db.insert("Book",null,values);            }        });

(5).更新数据:

SQLiteDatabase中提供了一个update()方法来进行添加数据,他接收四个参数,
第一个参数也是表名,第二个是ContentValues对象,第三,第四个参数用于约束的,相当于SQL语句中的WHERE。
不做实例,直接看代码:

@Override            public void onClick(View view){                SQLiteDatabase db = dbHlper.getReadableDatabase();                ContentValues values = new ContentValues();                values.put("price","66");                db.update("Book",values,"name=?",new String[]{"David"});            }        });

ContentValues对象只指定了一组数据,只想把价格这一列数据更新成66,然后调用SQLiteDatabase的update()方法来进行操作,
第三个参数对应SQL语句的WHERE部分,表示更新所有name等于?的行,?是一个占位符,可以通过第四个参数提供的一个字符串数组作为第三个参数中占位符指定的相应的内容。

(6).删除数据:

SQLiteDatabase中提供了一个delete()方法来进行删除数据,他接收三个参数,
第一个参数也是表名,第二,第三个参数用于约束的,相当于SQL语句中的WHERE。

        @Override            public void onClick(View view){                SQLiteDatabase db = dbHlper.getReadableDatabase();                db.update("Book","price>?",new String[]{"50"});//表示删除价格大于50的书籍            }        });

(7).查询数据:

SQLiteDatabase中提供了一个delete()方法来进行删除数据,他接收7个参数(神经病。。),
第一个参数也是表名,第二个参数用于指定去查询哪几列,不指定表示所有列。第三,第四个参数用于约束查询某一行或者某几行的数据,不指定表示所有列。
第五行数据用于指定group by 的列,不指定则表示不进行该操作。
第六行表示对于group by 后的数据进行进一步过滤,不指定表示不进行该操作。
第七行参数用于指定查询结果的排序方式,不指定则表示使用默认的方式。

<!--activity_main.xml--><Button        android:id="@+id/select_data"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textAllCaps="false"        android:text="@string/select_data"/>//MainActivity.java//查询        Button button3 = (Button)findViewById(R.id.select_data);        button3.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                SQLiteDatabase db = dbHlper.getWritableDatabase();                //查询Book表中的所有行                Cursor cursor = db.query("Book",null,null,null,null,null,null,null);                if (cursor.moveToFirst()){                    do {                        //遍历Cursor对象并打印                        String name = cursor.getString(cursor.getColumnIndex("name"));                        String author = cursor.getString(cursor.getColumnIndex("author"));                        int pages = cursor.getInt(cursor.getColumnIndex("pages"));                        double price = cursor.getDouble(cursor.getColumnIndex("price"));                        Log.d("MainActivity:","Book name is:"+name);                        Log.d("MainActivity:","Book author is:"+author);                        Log.d("MainActivity:","Book pages is:"+pages);                        Log.d("MainActivity:","Book price is:"+price);                    }while (cursor.moveToNext());                }            }        });

13.LineLayout详解。
对于LineLayout布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"        android:orientation="vertical"        android:layout_width="match_parent"        android:layout_height="wrap_content">    </LinearLayout>

其中vertical表示垂直分布,如果是horizontal,那就是水平排列了。如果不指定android:orientation的值,则系统默认为horizontal。
值得注意的地方是:
如果LinearLayout的排列方向是horizontal,那么控件的layout_width不能为match_parent,如果这样那么一个控件就会将整个水平方向占满。
同理,排列方向是vertical时,就不能使控件的layout_height为match_parent。

(1).android:layout_gravity属性
现在来看android:layout_gravity属性(和android:gravity的区别是:android_gravity是指定控件中的文本的对齐方式,而android:layout_gravity是指定布局中的控件的对齐方式):

android:layout_gravity的可选值和android_gravity中的可选值差不多,但是LinearLayout的排列方式是horizontal时,
只有垂直方向上的排列方式有效,因为水平方向上的长度是不确定的,每添加一个控件,水平方向上的长度都会改变,所以无法指定
该方向上的对齐方式;同理排列方式是vertical时,只有水平方向上的排列方式有效。

(2).android:layout_weight属性

当我们使用android:layout_weight属性时,此时控件的宽度就不再由android:layout_width属性来指定了,然后
android:layout_weight属性的值就代表平分屏幕宽度后所占有的比例,比如:

<Button        android:layout_width="wrap_content"        android:layout_height="match_parent"        android:layout_weight="3"/><EditText        android:layout_width="wrap_content"        android:layout_height="match_parent"        android:layout_weight="2"/>

此时就表示Button控件的宽度占屏幕的3/5,而EditText的宽度占屏幕的2/5.当然,也可以写wrap_content。

14.打电话的两种方法,直接跳转和使用权限:callPhone需要申请权限。

15.布局的关联,相互直接布局的嵌套(嵌套标签的使用,三个布局合而为一,第三章内容)
对于布局的嵌套使用其实也蛮简单的,只需要添加标签就行了。
例子如下:

<!--title.xml--><?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:background="@drawable/title_bg">    <Button        android:id="@+id/title_back"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:layout_margin="5dp"        android:background="@drawable/back_bg"        android:text="Back"        android:textColor="#fff" />    <TextView        android:id="@+id/title_text"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:layout_weight="1"        android:gravity="center"        android:text="Title Text"        android:textColor="#fff"        android:textSize="24sp" />    <Button        android:id="@+id/title_edit"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:layout_margin="5dp"        android:background="@drawable/edit_bg"        android:text="Edit"        android:textColor="#fff" />    </LinearLayout>

以上是一个Title标签,作用是标题。

<!--button.xml--><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content">    <ImageView        android:src="@drawable/ed"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"       /></RelativeLayout>

以上是底标签。

<!--activity_main.xml--><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="wrap_content">    <include layout="@layout/title"/><!--插入标题标签-->    <Button        android:id="@+id/ButtonOne"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textAllCaps="false"        android:text="@string/ButtonOne"/>    <include layout="@layout/buttom"/><!--插入底标签--></LinearLayout>

以上是MainActivity的布局。
结果:

16.右上侧菜单(扫一扫等等)的创建:的使用,menu文件夹下创建menu,activity的文件下添加的内容,创建事件Toast。(重点)
步骤:

1.在res文件夹下先创建menu路径文件夹,然后创建Menu resource file:main
2.在main文件中使用标签来添加内容:

<item  android:id="@+id/movie"  android:title="@string/movie"/> <item  android:id="@+id/comic"  android:title="@string/comic" /><item  android:id="@+id/music"  android:title="@string/music"/><item  android:id="@+id/more"  android:title="@string/more"/>

3.在相应的Activity活动中编写onCreateOptionMenu()方法:

@Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.main,menu);        //通过getMenuInflater()方法能够得到MenuInflater对象,然后再调用它的inflate()方法就可以给当前活动创建菜单了。        //inflate()方法接收两个参数,一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然是传入R.menu.main        //另一个参数是用于指定我们的菜单项将添加到哪一个Menu对象当中,这里我们还需传入函数中的对象menu就行了。        //然后返回true方法表示允许创建的菜单显示出来。        return true;    }

4.最后再用onOptionsItemSelected()函数来定义菜单响应事件:

 @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()){        //通过调用item.getItemId()方法来判断我们点击的是哪一个菜单项。            case R.id.movie:                Toast.makeText(this,"you clicked movie",Toast.LENGTH_SHORT).show();                //对于Toast的用法很简单,只需要通过静态方法makeText()创建出一个Toast对象,然后调用show()方发现是就行了。                //makeText()方法需要传入三个参数:第一个是活动本身,传入MainLayoutActivity.this(活动名.this)即可                //第二个是要显示的文本信息,第三个是显示的时长,有两个内置常量:Toast.LENGTH_SHORT与Toast.LENGTH_LONG                break;            case R.id.comic:                Toast.makeText(this,"you clicked comic",Toast.LENGTH_SHORT).show();                break;            case R.id.music:                Toast.makeText(this,"you clicked music",Toast.LENGTH_SHORT).show();                break;            case R.id.more:                Toast.makeText(this,"you clicked more",Toast.LENGTH_SHORT).show();                break;            default:        }        return  true;    }

17.充话费的使用,返回activity的使用,setreturnActivity的使用
intent传递数据:
FirstActivity传到SecondActivity:

FirstActivity传数据:

  @Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main_layout);    String data = "Hello SecondActivity";    Button button1 = (Button) findViewById(R.id.button);    button1.setOnClickListener(new View.OnClickListener(){        @Override        public void onClick(View view) {            Intent intent = new Intent(MainLayoutActivity.this,SecondActivity.class);            intent.putExtra("Data",data);            startActivity(intent);        }    });

SecondActivity接收数据:

 @Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.second_layout);    Intent intent = getIntent();    String data = intent.getStringExtra("Data");    Log.d("Data",data);}

intent返回数据:

FirstActivity设置:

   @Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main_layout);    Button button1 = (Button) findViewById(R.id.button);    button1.setOnClickListener(new View.OnClickListener(){        @Override        public void onClick(View view) {            Intent intent = new Intent(MainLayoutActivity.this,SecondActivity.class);            startActivityForResult(intent,1);        }    });

SecondActivity接收加传送:

    Button button2 = (Button)findViewById(R.id.button2);    button2.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View view) {            String data = "Hello FirstActivity";            Intent intent = new Intent();            intent.putExtra("data_return",data);            setResult(RESULT_OK,intent);            finish();        }    });

FirstActivity接收:

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    switch (requestCode){        case 1:            if (requestCode == RESULT_OK){                String rutunedData = data.getStringExtra("data_return");                Log.d("FirstActivity",rutunedData);                break;            }            default:    }}

18.读电话本,读取姓名电话号码,读出来后用ListView(没讲),假设权限已经获得,常用变量也写出来了(重点,第三章内容)

我们要注意的是,无论是数组中的数据还是类里面方法中的数据都是无法直接传递给ListView的,需要适配器ArrayAdapter,它可以通过泛型来指定要适配的数据类型。
然后再构造函数中把适配的数据传入。最后调用ListView的setAdapter()方法将构建好的适配器对象传递进去。

实战一番吧:

(1).在activity_main.xml中添加ListView:

    <ListView        android:id="@+id/listView"        android:layout_width="match_parent"        android:layout_height="wrap_content"/>

(2).定义一个PhoneCall类,作为适配器的适配类型。代码如下:

public class PhoneCall {    private String PhoneNumber;//电话号码    private String name;//名字    public PhoneCall(String name,String PhoneNumber){        this.PhoneNumber = PhoneNumber;        this.name = name;    }    public String getPhoneNumber() {return PhoneNumber;}    public String getName() {        return name;    }}

(3).然后需要为ListView的子项制定一个我们自定义的布局,在layout文件夹下创建phone_item布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"    android:layout_height="match_parent">    <TextView        android:id="@+id/phoneNumber"        android:layout_width="wrap_content"        android:layout_height="30dp"        android:layout_gravity="center"        android:layout_weight="1"        />    <TextView        android:id="@+id/name"        android:layout_width="wrap_content"        android:layout_height="30dp"        android:layout_gravity="center"        android:layout_weight="1"        /></LinearLayout>

(4).接下来需要自定义一个适配器,这个适配器继承与ArrayAdapter,并将泛型指定为PhoneCall:

public class PhoneAdapter extends ArrayAdapter<PhoneCall> {    private int resourceId;    //重写了父类的一组构造函数,用于将上下文,ListView子项布局的id和数据传递进来。    public PhoneAdapter(Context context, int textViewResourceId,List<PhoneCall> objects){        super(context,textViewResourceId,objects);        resourceId = textViewResourceId;    }    //重写了getView()方法,这个方法在每个子项被滚动到屏幕内的时候会被调用    //在getView()方法中,首先通过getItem()方法将得到前项的PhoneCall实例,    //然后使用LayoutInflater来为这个子项加载到我们布局中。    @Override    public View getView(int position,  View convertView,  ViewGroup parent) {        PhoneCall phoneCall = getItem(position);        //第三个参数定义成false,表示只让我们在父布局中声明的layout属性失效        View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);        TextView phoneNumber = (TextView)view.findViewById(R.id.phoneNumber);        TextView name = (TextView)view.findViewById(R.id.name);        phoneNumber.setText(phoneCall.getPhoneNumber());        name.setText(phoneCall.getName());        return view;    }}

(5).最后修改MainActivity中的代码:

public class MainActivity extends AppCompatActivity {    private List<PhoneCall> phoneList = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initPhone();//初始化PhoneCall参数        //创建PhoneAdapter对象,并将PhoneAdapter作为适配器传递给ListView,这样指定的就结束了        PhoneAdapter adapter = new PhoneAdapter(MainActivity.this,R.layout.phone_item,phoneList);        ListView listView = (ListView)findViewById(R.id.listView);        listView.setAdapter(adapter);    }    private void initPhone(){    //重复十遍,保证数据充满整个屏幕。        for(int i=0;i<10;i++){            PhoneCall David = new PhoneCall("David","1000011101");            phoneList.add(David);            PhoneCall Ross = new PhoneCall("Ross","1000011102");            phoneList.add(Ross);            PhoneCall Mike = new PhoneCall("Mike","1000011103");            phoneList.add(Mike);        }    }}

结果:

补充知识点:
1.活动中添加布局的函数:setContentView

setContentView(R.layout.activity_main);

原创粉丝点击