2015年3月13日 星期五

Android Call Phone

activity_main.xml
<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text=""
            android:ems="10"
            android:id="@+id/edt_PhoneNumber"
             />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/btn_CallPhone" />
    </LinearLayout>

</RelativeLayout>

MainActivity.java
package com.example.win7.make_a_call;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class MainActivity extends Activity {
    private EditText edt_PhoneNumber;
    private Button btn_CallPhone;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edt_PhoneNumber=(EditText)findViewById(R.id.edt_PhoneNumber);
        btn_CallPhone=(Button)findViewById(R.id.btn_CallPhone);
        btn_CallPhone.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View view) {
                try {
                    /*getText()取得使用者輸入號碼*/
                    String phonenumber = edt_PhoneNumber.getText().toString();
                    //建立一個Intent並且在建構式中加入action.CALL字串用來設定所建立的Intent物件是用來打電話
                    //第二個參數使用Uri.parse()方法,並將使用者輸入號碼傳入
                    Intent intent_CallPhone = new Intent("android.intent.action.CALL", Uri.parse("tel:"+phonenumber));
                    startActivity(intent_CallPhone);
                    edt_PhoneNumber.setText("");
                }catch (Exception ex){
                    ex.printStackTrace();
                }

            }
            //start
        });
    }
}



AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.win7.make_a_call" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <!--打電話權限-->
    <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
</manifest>

2015年3月11日 星期三

Android控制項Toast and Notification

Toast用來快顯訊息,顯示後自行消失
Notification用來顯示裝態列訊息

activity_main.xml

<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Toast Demo"
            android:id="@+id/btn_Toast" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Notification Demo"
            android:id="@+id/btn_Notification" />
    </LinearLayout>
</RelativeLayout>
MainActivity.java
package com.example.win7.toast_and_notification;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MainActivity extends Activity {
    private Button btn_Toast,btn_Notification;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setupViewComent();
    }
    private void setupViewComent(){
        btn_Toast=(Button)findViewById(R.id.btn_Toast);
        btn_Toast.setOnClickListener(ocl_Toast);

        btn_Notification=(Button)findViewById(R.id.btn_Notification);
        btn_Notification.setOnClickListener(ocl_Notification);
    }

   private Button.OnClickListener ocl_Toast = new Button.OnClickListener(){

       @Override
       public void onClick(View view) {
           setTitle("Toast Demo");
           Intent intent_Toast = new Intent(MainActivity.this,SampleToast.class);
           startActivity(intent_Toast);
       }
   };

    private Button.OnClickListener ocl_Notification = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            setTitle("Notification");
            Intent intent_Notification = new Intent(MainActivity.this,SampleNotification.class);
            startActivity(intent_Notification);
        }
    };
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

sample_toast.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="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="短時間顯示Toast"
            android:id="@+id/btn_Display_Short" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="長時間顯示Toast"
            android:id="@+id/btn_Display_Long" />
    </LinearLayout>
</LinearLayout>
toast_content.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="match_parent"
    android:weightSum="1">


    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageView"
            android:src="@mipmap/ic_launcher" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/txv_Toast_Cntent"
            android:layout_gravity="center_vertical" />
    </FrameLayout>

</LinearLayout>
SampleToast.java

package com.example.win7.toast_and_notification;

import android.app.Activity;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Created by win7 on 2015/3/9.
 */
public class SampleToast extends Activity {
    private Button btn_Display_Short,btn_Display_Long;
    private TextView txv_Toast_Cntent;
    private Toast tot_Toast;
    private LayoutInflater lia_LayoutInflater;
    private NotificationManager nom_notificationManager;
    private static int NOTIFICATIONS_ID = R.layout.sample_toast;
    private View viw_InflateView;
    private PendingIntent pei_pendingIntent;
    public void onCreate(Bundle savedInsatnceState){
        super.onCreate(savedInsatnceState);
        setContentView(R.layout.sample_toast);
        setupViewComent();
    }
    private void setupViewComent(){
        btn_Display_Short=(Button)findViewById(R.id.btn_Display_Short);
        btn_Display_Short.setOnClickListener(ocl_Display_Short);

        btn_Display_Long=(Button)findViewById(R.id.btn_Display_Long);
        btn_Display_Long.setOnClickListener(ocl_Display_Long);
    }
    private Button.OnClickListener ocl_Display_Short =new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            setTitle("短時間顯示Toast");
            DisplayToast(Toast.LENGTH_SHORT);
        }
    };

    private Button.OnClickListener ocl_Display_Long =new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            setTitle("長時間顯示Toast");
            DisplayToast(Toast.LENGTH_LONG);
        }
    };
    /*定義顯示Toasr快顯方法*/
    protected void DisplayToast(int type){
        /*使用InflateView()方 法,傳入layout的id取得Toasr的View物件參考*/
        viw_InflateView = InflateView(R.layout.toast_content);
        txv_Toast_Cntent=(TextView)viw_InflateView.findViewById(R.id.txv_Toast_Cntent);
        txv_Toast_Cntent.setText("善意提醒你長時間看螢幕傷眼睛");
        /*文字訊息設定好後,建立在Toast物件上呼叫setView()將剛剛自準備好的View物件指派給Toast物件*/
        tot_Toast = new Toast(this);
        tot_Toast.setView(viw_InflateView);
        /*使用傳入的type型態*/
        tot_Toast.setDuration(type);
        tot_Toast.show();
    }
    /*定義InflateView()方法,使用傳入的resource id以取得layout所定義的view物件*/
    private View InflateView(int resource) {
        lia_LayoutInflater =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        return lia_LayoutInflater.inflate(resource,null);
    }
}
sample_notification.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="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="電量不足,請充電!"
            android:id="@+id/btn_LowBattery" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="充電中"
            android:id="@+id/btn_InCharging" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="使用AC電源中"
            android:id="@+id/btn_ACAdapter" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="進階Notification"
            android:id="@+id/txv_AdvancedNotification" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="只發出聲音"
            android:id="@+id/btn_Voice" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="只產生振動的Notification"
            android:id="@+id/btn_Vibrate" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="同時發出聲音也產生震動"
            android:id="@+id/btn_VibrateAndVoice" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="回覆初始的Notification"
            android:id="@+id/btn_Resore" />
    </LinearLayout>

</LinearLayout>
SampleNotification.java
package com.example.win7.toast_and_notification;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * Created by win7 on 2015/3/9.
 */
public class SampleNotification extends Activity {
    private Button btn_LowBattery,btn_InCharging,btn_ACAdapter;
    private Button btn_Voice,btn_Vibrate,btn_VibrateAndVoice,btn_Resore;
    /*取得notification layout的id*/
    private static int NOTIFICATIONS_ID = R.layout.sample_notification;
    private NotificationManager nim_notificationManager;
    private PendingIntent pei_pendingIntent;
    private String s_Title;
    private String s_Content;
    public void onCreate(Bundle savedInstanceState ){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_notification);
        setupViewComent();
        /*呼叫Context.getSystemService()方法取得NotificationManager實體參考*/
        nim_notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

    }
    private void setupViewComent(){

        btn_LowBattery=(Button)findViewById(R.id.btn_LowBattery);
        btn_LowBattery.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View view) {
                setStatus("電量不足","電源狀態","電量不足,請充電",R.drawable.battery);
               // txv_AdvancedNotification.setText("123");
            }
        });

        btn_InCharging=(Button)findViewById(R.id.btn_InCharging);
        btn_InCharging.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View view) {
                setStatus("充電中","電源狀態","充電中",R.drawable.battery);
            }
        });
        btn_ACAdapter=(Button)findViewById(R.id.btn_ACAdapter);
        btn_ACAdapter.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View view) {
                setStatus("使用AC電源中","電源狀態","使用AC電源中",R.drawable.battery);
            }
        });
        btn_Voice=(Button)findViewById(R.id.btn_Voice);
        btn_Voice.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View view) {
                Initial(Notification.DEFAULT_SOUND);
            }
        });
        btn_Vibrate=(Button)findViewById(R.id.btn_Vibrate);
        btn_Vibrate.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View view) {
                Initial(Notification.DEFAULT_VIBRATE);
            }
        });
        btn_VibrateAndVoice=(Button)findViewById(R.id.btn_VibrateAndVoice);
        btn_VibrateAndVoice.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View view) {
                Initial(Notification.DEFAULT_ALL);
            }
        });
        btn_Resore=(Button)findViewById(R.id.btn_Resore);
        btn_Resore.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View view) {
                nim_notificationManager.cancel(NOTIFICATIONS_ID);
            }
        });

    }
    private void setStatus(String tickerText,String title,String content,int drawable){
        /*建立一個Notifcation*/
        Notification noc_Notification = new Notification(drawable,tickerText,System.currentTimeMillis());
        /*建立一個PendingIntent*/
        PendingIntent pei_pendingIntent =  PendingIntent.getActivity(this,0,new Intent(this,MainActivity.class),0);
        /*呼叫setLatestEventInfo來配置Notification的外觀*/
        noc_Notification.setLatestEventInfo(this,title,content,pei_pendingIntent);
        /*呼叫Notification Manager的notify()方法,傳入Notification物件完成呼叫*/
        nim_notificationManager.notify(NOTIFICATIONS_ID,noc_Notification);
    }

     private void Initial(int defaults){
         /*呼叫靜態方法getActivity()取得PendingIntent實體*/
        pei_pendingIntent = PendingIntent.getActivity(this,0,new Intent(this,MainActivity.class),0);
        s_Title="電原狀態";
        s_Content="電量不足,請充電";
         /*建立一個Notifcation*/
        final Notification notification = new Notification(R.mipmap.battery,s_Content,System.currentTimeMillis());
         /*呼叫setLatestEventInfo()方法設定Notification的Title與Content,注意這裡主要將建立PendingIntent物件傳入*/
        notification.setLatestEventInfo(this,s_Title,s_Content,pei_pendingIntent);
         /*指派Notification的形態,DEFAULT_SOUND(聲音),DEFAULT_VIBRATE(震動),DEFAULT_LIGHT(閃光)*/
        notification.defaults=defaults;
         /*呼叫NotificationManager的notify()方法將Notification物件傳入來啟動Notification*/
        nim_notificationManager.notify(NOTIFICATIONS_ID,notification);
     }
}

2015年3月8日 星期日

Android控制項Dialog

對話框,所有應用程式或系統程式要回應使用者的主要方式,好的對話框可以讓使用者非常清楚應用程式目前狀態。

重點
建議在設計應用程式之初,獨立一個資料夾去設計並且加入對話框,每個地方需要使用到對話框的時候乎叫共同的程式碼,如此一來整個應用程式有統一的對話架構。

activity_main.xml
<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="基本對話框"
            android:id="@+id/btn_SimpleDialog" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="擁有兩個Button的對話框"
            android:id="@+id/btn_DoubleDialog" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="擁有三個Button的對話框"
            android:id="@+id/btn_Tripleialog" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="進行登入驗證的對話框"
            android:id="@+id/btn_AuthenticationDialog" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="顯是進度的對話框 "
            android:id="@+id/btn_ProgressDialog" />
    </LinearLayout>
</RelativeLayout>


authentication_dialog
<?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">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="登入帳號"
            android:id="@+id/username_view" />

        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text="Name"
            android:ems="10"
            android:id="@+id/username_edit" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="登入密碼"
            android:id="@+id/password_view" />

        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text="Name"
            android:ems="10"
            android:id="@+id/password_edit" />

    </LinearLayout>
</LinearLayout>

string.xml
<resources>
    <string name="app_name">Dialog</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="alert_simple_dialog_title">這是個提示框。請按確定返回</string>
    <string name="alert_double_dialog_title">這是個提示框。請任點選下列按鈕返回</string>
    <string name="alert_double_dialog_message">是否退出遊戲</string>
    <string name="alert_double_dialog_context">確定要退出遊戲請點選確定按鈕。如果要繼續遊戲請點選取消按鈕。如果想要了解最高分可以點選最高紀錄按鈕</string>
    <string name="alert_double_dialog_ok">確定</string>
    <string name="alert_double_dialog_hide">隱藏</string>
    <string name="alert_double_dialog_something">最高紀錄</string>
    <string name="alert_double_dialog_cancel">取消</string>
    <string name="alert_double_dialog_entry">請輸入</string>
</resources>

MainActivity.java
package com.example.win7.dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MainActivity extends Activity {
    /*設定5個int來作為五個對話框識別,使用Menu來產生*/
    private static final int Dialog1 = Menu.FIRST;
    private static final int Dialog2 = Menu.FIRST+1;
    private static final int Dialog3 = Menu.FIRST+2;
    private static final int Dialog4 = Menu.FIRST+3;
    private static final int Dialog5 = Menu.FIRST+4;
    private Button btn_SimpleDialog,btn_DoubleDialog,btn_Tripleialog,btn_AuthenticationDialog,btn_ProgressDialog;
    private AlertDialog.Builder alb_SimpleDialog;
    private AlertDialog.Builder alb_DoubleDialog;
    private AlertDialog.Builder alb_Tripleialog;
    private AlertDialog.Builder alb_AuthenticationDialog;
    private LayoutInflater lai_AuthenticationDialog;
    private ProgressDialog prd_ProgressDialog;
    /*覆寫Activity的onCreateDialog方法,當成是執行到Activity的showDialog()方法時
    * onCreateDialog()方法會自動乎叫並且傳入id*/
    protected Dialog onCreateDialog(int id){
        switch (id){
            case Dialog1:
                setTitle("目前點選是:基本對話框");
            /*呼叫BuildDialog()方法來建立對話框*/
                return BuildDialog1(MainActivity.this);
            case Dialog2:
                setTitle("目前點選是:擁有兩個Button的對話框");
                return BuildDialog2(MainActivity.this);
            case Dialog3:
                setTitle("目前點選是:擁有三個Button的對話框");
                return BuildDialog3(MainActivity.this);
            case Dialog4:
                setTitle("目前點選是:進行登入對話框");
                return BuildDialog4(MainActivity.this);
            case Dialog5:
                setTitle("目前點選是:顯示進度");
                return BuildDialog5(MainActivity.this);
        }
        return null;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*showDialog()方法建立對話框視窗*/
        setupViewComponent();
     }
    private void setupViewComponent(){
        btn_SimpleDialog=(Button)findViewById(R.id.btn_SimpleDialog);
        btn_SimpleDialog.setOnClickListener(Go_SimpleDialog);

        btn_DoubleDialog=(Button)findViewById(R.id.btn_DoubleDialog);
        btn_DoubleDialog.setOnClickListener(Go_DoubleDialog);

        btn_Tripleialog=(Button)findViewById(R.id.btn_Tripleialog);
        btn_Tripleialog.setOnClickListener(Go_Tripleialog);

        btn_AuthenticationDialog=(Button)findViewById(R.id.btn_AuthenticationDialog);
        btn_AuthenticationDialog.setOnClickListener(Go_AuthenticationDialog);

        btn_ProgressDialog=(Button)findViewById(R.id.btn_ProgressDialog);
        btn_ProgressDialog.setOnClickListener(Go_ProgressDialog);
    }
    private Button.OnClickListener Go_SimpleDialog = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            showDialog(Dialog1);
        }
    };

    private Button.OnClickListener Go_DoubleDialog = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            showDialog(Dialog2);
        }
    };

    private Button.OnClickListener Go_Tripleialog = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            showDialog(Dialog3);
        }
    };

    private Button.OnClickListener Go_AuthenticationDialog = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            showDialog(Dialog4);
        }
    };

    private Button.OnClickListener Go_ProgressDialog = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            showDialog(Dialog5);
        }
    };
    private Dialog BuildDialog1(Context context){
        /*呼叫AlertDialog.Builder()方法建立對話視窗*/
        alb_SimpleDialog = new AlertDialog.Builder(context);
        alb_SimpleDialog.setTitle(R.string.alert_simple_dialog_title);
        alb_SimpleDialog.setIcon(R.mipmap.ic_launcher);
        /*在基本對話框上面配置確定按鈕*/
        alb_SimpleDialog.setPositiveButton(R.string.alert_double_dialog_ok,
            new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog,int whichButton){
                setTitle("點選了基本對話框的確定鍵");
            }
        });
        /*呼叫create()方法將使得對話框實體被建立出來,但是要直到呼叫show()或者showDialog()方法,該對話框式視窗才會顯示出來*/
        return alb_SimpleDialog.create();
    }

    private Dialog BuildDialog2(Context context){
        alb_DoubleDialog = new AlertDialog.Builder(context);
        alb_DoubleDialog.setTitle(R.string.alert_double_dialog_title);
        alb_DoubleDialog.setIcon(R.mipmap.ic_launcher);
        alb_DoubleDialog.setPositiveButton(R.string.alert_double_dialog_ok,
                new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog,int whichButton){
                        setTitle("點選了有兩個對話框的確定鍵");
                    }
                });
        alb_DoubleDialog.setNegativeButton(R.string.alert_double_dialog_cancel,
                new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setTitle("點選了有兩個對話框的取消鍵");
                    }
                } );
        return alb_DoubleDialog.create();
    }

    private Dialog BuildDialog3(Context context){
        alb_Tripleialog = new AlertDialog.Builder(context);
        alb_Tripleialog.setTitle(R.string.alert_double_dialog_message);
        alb_Tripleialog.setMessage(R.string.alert_double_dialog_context);
        alb_Tripleialog.setIcon(R.mipmap.ic_launcher);
        alb_Tripleialog.setPositiveButton(R.string.alert_double_dialog_ok,
                new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog,int whichButton){
                        setTitle("點選了有三個對話框的確定鍵");
                    }
                });
        alb_Tripleialog.setNeutralButton(R.string.alert_double_dialog_something,
                new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setTitle("點選了有三個對話框的最高分數鍵");
                    }
                } );
        alb_Tripleialog.setNegativeButton(R.string.alert_double_dialog_cancel,
                new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setTitle("點選了有三個對話框的取消鍵");
                    }
                } );
        return alb_Tripleialog.create();
    }

    private Dialog BuildDialog4(Context context){
        lai_AuthenticationDialog = LayoutInflater.from(this);
        final View textEntryView = lai_AuthenticationDialog.inflate(
                R.layout.authentication_dialog,null);

        alb_AuthenticationDialog = new AlertDialog.Builder(context);
        alb_AuthenticationDialog.setTitle(R.string.alert_double_dialog_entry);
        alb_AuthenticationDialog.setIcon(R.mipmap.ic_launcher);

        alb_AuthenticationDialog.setView(textEntryView);

        alb_AuthenticationDialog.setPositiveButton(R.string.alert_double_dialog_ok,
                new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setTitle("點選了驗證框的確定鍵");
                    }
                });
        alb_AuthenticationDialog.setNegativeButton(R.string.alert_double_dialog_cancel,
                new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setTitle("點選了驗證框的取消鍵");
                    }
                });
        return alb_AuthenticationDialog.create();
    }

    private Dialog BuildDialog5(Context context){
        prd_ProgressDialog = new ProgressDialog(context);
        prd_ProgressDialog.setTitle("資料處理中");
        prd_ProgressDialog.setMessage("請稍候....");

        return prd_ProgressDialog;
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Android的控制項Menu

Menu控制項是專門用來做手機應用程式的功能選單的,這種選單會出現在畫面的下方,類似一長條的Bar,上面有安排的功能按鈕,當手機的Menu健被使用者點擊時會呼叫建立出的Menu的畫面。

重點
Menu的設計最主要分為兩個事件onCreateOptionsMenu()與onOptionsItemSelected()

activity_main.xml
<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="請點選Menu鍵來顯示"
        android:id="@+id/txv_Title"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>
MainActivity.java
package com.example.win7.menu;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.TextView;


public class MainActivity extends Activity {
    private TextView txv_Title;
    public static final int itm_Menu1 = Menu.FIRST;
    public static final int itm_Menu2 = Menu.FIRST+1;
    public static final int itm_Menu3 = Menu.FIRST+2;
    public static final int itm_Menu4 = Menu.FIRST+3;
    public static final int itm_Menu5 = Menu.FIRST+4;
    public static final int itm_Menu6 = Menu.FIRST+5;
    public static final int itm_Menu7 = Menu.FIRST+6;
    public static final int itm_Menu8 = Menu.FIRST+7;
    public static final int itm_Menu9 = Menu.FIRST+8;
    /*宣告三個子功能選單變數*/
    private SubMenu sum_ShortCut;//快捷方式
    private SubMenu sum_Menu;
    private SubMenu sum_Help;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txv_Title=(TextView)findViewById(R.id.txv_Title);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        boolean b_Result = super.onCreateOptionsMenu(menu);
        sum_ShortCut = menu.addSubMenu(0, itm_Menu1, 0, "捷徑");
        sum_ShortCut.add(0, itm_Menu2, 0,"鍵盤鎖");
        sum_ShortCut.add(0, itm_Menu3, 1,"操作模式");

        sum_Menu = menu.addSubMenu(1, itm_Menu4, 0,"功能表");
        sum_Menu.add(0 ,itm_Menu4, 0,"訊息服務");
        sum_Menu.add(0 ,itm_Menu6, 1,"設定");

        sum_Help = menu.addSubMenu(2 , itm_Menu7, 0,"通訊錄");
        sum_Help.add(0, itm_Menu8, 0,"好友1");
        sum_Help.add(0, itm_Menu9, 0 ,"好友2");
        return b_Result;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
       switch (item.getItemId()){
           case itm_Menu1:
               txv_Title.setText("以點選捷徑選單");
               break;
           case itm_Menu2:
               txv_Title.setText("以點選-捷徑鎖");
               break;
           case itm_Menu3:
               txv_Title.setText("以點選捷-操作模式");
               break;
           case itm_Menu4:
               txv_Title.setText("以點選功能表選單");
               break;
           case itm_Menu5:
               txv_Title.setText("以點選-訊息服務");
               break;
           case itm_Menu6:
               txv_Title.setText("以點選-設定");
               break;
           case itm_Menu7:
               txv_Title.setText("以點選通訊錄");
               break;
           case itm_Menu8:
               txv_Title.setText("以點選-好友1");
               break;
           case itm_Menu9:
               txv_Title.setText("以點選-好友2");
               break;
       }
        return super.onOptionsItemSelected(item);
    }
}

2015年3月1日 星期日

Android控制項TabWidget


  1. 標籤頁上的控制都還在同一個Activity上所以變數以及參考的共用與互用,不需額外撰寫程式傳遞,省掉很多麻煩 。
  2. TabWidget控制項不是完全沒有確定,分布在各個標籤頁的控制像增多以後,初始化的時後會全部出始,易造成資源大量流失,速度變慢。 但資源足夠(機器夠快,記憶體足)就不需擔心。
sample_tabwidget.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="match_parent">

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="目前選擇tab1"
            android:id="@+id/tab1" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="目前選擇tab2"
            android:id="@+id/tab2" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="目前選擇tab3"
            android:id="@+id/tab3" />
    </FrameLayout>

</LinearLayout>

SampleTabWidget.java
package com.example.win7.android_widget;

import android.app.TabActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TabHost;

/**
 * Created by win7 on 2015/2/28.
 */
public class Sample_TabWidget extends TabActivity {
    private TabHost tab_TabHost;
    public void onCreate(Bundle savedIstanceState){
        super.onCreate(savedIstanceState);
        /*getTabHost()方法取得配置在目前的View上的TabWidget控制項*/
        tab_TabHost = getTabHost();
        LayoutInflater.from(this).inflate(R.layout.sample_tab_widget,tab_TabHost.getTabContentView(),true);
        /*TabWidget控制項addTab()方法動態加入TabPage標籤頁,注意在addTab()方法中直接乎叫newTabSpec()方法建立新標籤頁
                *再連續呼叫setIndicator()方法指派標籤頁的標籤文字,再接著呼叫setContent()方法指派給TextView控制項*/
        tab_TabHost.addTab(tab_TabHost.newTabSpec("TAB1").setIndicator("TAB1").setContent(R.id.tab1));
        tab_TabHost.addTab(tab_TabHost.newTabSpec("TAB2").setIndicator("TAB2").setContent(R.id.tab2));
        tab_TabHost.addTab(tab_TabHost.newTabSpec("TAB3").setIndicator("TAB3").setContent(R.id.tab3));
    }
}

Android控制項AutoCompleteTextView


  1. AutoCompleteTextView控制項的自動完成字串是使用字串陣列短Adapter的方式橋接給控制項作為資料來源的,實際上的方式是使用外部檔案,或是資料庫的方式來提供。
sample_auto_complete_text_view.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="match_parent">

    <AutoCompleteTextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:id="@+id/auc_autoCompleteTextView"
        android:layout_weight="1" />
</LinearLayout>
SampleAutoCompleteTextView.java
package com.example.win7.android_widget;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

/**
 * Created by win7 on 2015/2/25.
 */
package com.example.win7.android_widget;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

/**
 * Created by win7 on 2015/2/25.
 */
public class SampleAutoCompleteTextView extends Activity {
    private AutoCompleteTextView auc_autoCompleteTextViewv;
    static final String[] COUNTRIES = new String[]{"Aklsds","Aksddfds","Asssssss","Azzzzzzzzzzz","Azxdfd"};
    public void onCreate(Bundle savedInstaceState){
        super.onCreate(savedInstaceState);
        setContentView(R.layout.sample_auto_complete_text_view);

        /*New 一個ArrayAdapter的實體,並且將定義好的資料傳入ArrayAdapter的實體*/
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,COUNTRIES);
        auc_autoCompleteTextViewv=(AutoCompleteTextView)findViewById(R.id.auc_autoCompleteTextView);
        auc_autoCompleteTextViewv.setAdapter(adapter);

    }
}

Android控制項ProgressBar

進度控制項-ProgressBar

ProgressBar有兩個重點

  1. 配置的型態,開發人員配置進度控制項要根據實際的狀況,跟使用習慣判斷哪種型態與外觀最適合。
  2. 背景或其他執行緒也進行著,利用ProgressBar來回饋最新進度給使用者。
sample_progress_bar.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="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="大圓形進度控制項"
            android:id="@+id/big_progressbar" />

        <ProgressBar
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/prb_big" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="中圓形進度控制項"
            android:id="@+id/textView3" />

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

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="小圓形進度控制項"
            android:id="@+id/textView4" />

        <ProgressBar
            style="?android:attr/progressBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/prb_little" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="水平進度控制項"
            android:id="@+id/textView5" />

        <ProgressBar
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/prb_horizontal"
            android:indeterminateOnly="false"
            android:minHeight="20dip"
            android:longClickable="false"
            android:max="100"
            android:progress="30"
            android:secondaryProgress="65" />
    </LinearLayout>
</LinearLayout>
SampleProgressBar.java
package com.example.win7.android_widget;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
/*使用Message來作為副執行緒與主執行緒兼傳遞訊息的物件,引用其package*/
import android.os.Message;
import android.widget.ProgressBar;

/**
 * Created by win7 on 2015/2/19.
 */
public class SampleProgressBar extends Activity {
    private ProgressBar prb_horizontal;
    int myProgress=0;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_progress_bar);
        setTitle("這是ProgressBar的Activity");
        prb_horizontal = (ProgressBar) findViewById(R.id.prb_horizontal);
        prb_horizontal.setProgress(myProgress);
        /*使用一個執行緒Thread來執行讓ProgressBar的進度增加的動作,因為不能讓主畫面當在那邊所以使用另一個執行緒來執行,這是ProgressBar的標準做法*/
        new Thread(new Runnable() {
            /*覆寫Runnable類別的run()方法,將要執行的程式碼放在裡面,當這個執行緒被執行就會直接執行run()方法*/
            public void run() {
                while (myProgress < 100) {
                    try {
                        myHandle.sendMessage(myHandle.obtainMessage());
                        Thread.sleep(100);
                    } catch (Throwable t) {

                    }
                }
             }
            /*Thread物件不用指派變數就直接乎叫start()方法讓執行緒開始執行*/
        }).start();

    }
        /*建立一個Handler實體來處理傳送過來的Message,每當接收到Message就把ProgressBar的進程加1*/
        Handler myHandle = new Handler() {
            public void handleMessage(Message msg){
                myProgress++;
                prb_horizontal.setProgress(myProgress);
            }
        };



}