Android期末複習


題型:
選擇題: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 {

@Override
protected 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傳數據:

  @Override
protected 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接收數據:

 @Override
protected 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設置:

   @Override
protected 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接收:

@Override
protected 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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章