2015年5月9日 星期六

Android應用程式縮小後在背景執行

要做一個Service要先了解,service無法自己啟動,必須要靠startService()才能啟動。

同樣的啟動後也必須要使用stopService()關閉。

在這邊需要注意的有幾點

1) startService()

2) stopService()

3) AndroidManiFest.xml增加service權限

第一點為開啟service必要條件,當然你要new一個intent
所以就是:
Intent intent = new Intent(MainActivity.this,service_class.class);
startService(intent);

MainActivity為你目前的class,service_class則是另外開的java檔(那邊則是寫service做的事情)

第二點跟第一點很類似,只有差在start / stop的差別
Intent intent = new Intent(MainActivity.this,service_class.class);
stopService(intent);
第三點就是你需要在Android ManiFest.xml裡面新增權限
  <service android:name="service_class"></service>

Intent傳遞資料

傳遞資料A到B方法1
A.class
                //new一個intent物件,並指定Activity切換的class
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, B.class);
                intent.putExtra("name", name);//可放所有基本類別
                //切換Activity
                startActivity(intent);
B.class
Intent intent = this.getIntent();
//取得傳遞過來的資料   
String name = intent.getStringExtra("name");  
傳遞資料A到B方法2
A.class
//new一個intent物件,並指定Activity切換的class
Intent intent = new Intent();
intent.setClass(A.this,B.class);
 
//new一個Bundle物件,並將要傳遞的資料傳入
Bundle bundle = new Bundle();
bundle.putDouble("age",age );//傳遞Double
bundle.putString("name",name);//傳遞String
 
//將Bundle物件傳給intent
intent.putExtras(bundle);
 
//切換Activity
startActivity(intent);
B.class
Bundle bundle = getIntent().getExtras();  
String name = bundle.getString("name");
double age = bundle.getDouble("age");
A到B,B傳到A
A.class
Intent intent = new Intent(A.this,B.class);
//requestCode(識別碼) 型別為 int ,從B傳回來的物件將會有一樣的requestCode
startActivityForResult(intent,requestCode);
B.class
Intent intent = getIntent();
Bundle bundle = new Bundle();
bundle.putString("name",name);  
intent.putExtras(bundle); 
setResult(requestCode, intent); //requestCode需跟A.class的一樣 
B.this.finish();

download: 參考資料:
http://cookiesp.pixnet.net/blog/post/84190702-android-intent%26bundle-%E5%82%B3%E9%81%9E%E8%B3%87%E6%96%99

2015年5月8日 星期五

ListView加載聯絡人資料

製作一個清單的XML
main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <ListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listview" />

</RelativeLayout>
可以利用這樣的方法取得電話與人名
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
Final_code
package com.givemepass.providercontactdemo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class ProviderContactDemoActivity extends Activity {
    /**
     * Called when the activity is first created.
     */
    private ListView listView;
    private SimpleAdapter adapter;
    private static final String NAME = "name";
    private static final String NUMBER = "number";
    private Map contactsMap;
    ArrayList> contactsArrayList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        listView = (ListView) findViewById(R.id.listview);

        contactsArrayList = new ArrayList>();
        getPhoneBookData();
        adapter = new SimpleAdapter(this,
                contactsArrayList,
                android.R.layout.simple_list_item_2, new String[]{NAME,
                NUMBER}, new int[]{android.R.id.text1,
                android.R.id.text2});
        listView.setAdapter(adapter);
    }

    public void getPhoneBookData() {
  /*取得聯絡人姓名和電話*/
        Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        String phoneNumber = "";
        String name = "";

        while (cursor.moveToNext()) {
            contactsMap = new HashMap();

            name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            contactsMap.put(NAME, name);
            contactsMap.put(NUMBER, phoneNumber);
            contactsArrayList.add(contactsMap);
        }
    }
}
參考資料:
http://givemepass.blogspot.tw/2011/11/phone-book-contentresolver.html
Download_code:
http://uploadingit.com/file/st6wlycv8dxdanmr/ProviderContactDemo.rar

2015年5月7日 星期四

ListView電話簿找聯絡人

main.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="fill_parent"
        android:layout_height="fill_parent">

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/txt_print" />

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

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/txt_add_contact" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/txt_print_name" />
    </LinearLayout>

</LinearLayout>
listview_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <EditText
        android:id="@+id/search"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <requestFocus />
    </EditText>

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/search" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/textView"
        android:background="#ffacff89" />

</RelativeLayout>
listview_item.xml//清單裡載入的項目
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:id="@+id/txt_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ff91c6ff" />

    <TextView
        android:id="@+id/txt_number"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txt_name" />

</RelativeLayout>
Main.java
package com.androidbegin.filterlistviewtutorial;

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

/**
 * Created by win7 on 2015/3/31.
 */
public class Main extends Activity {
    private Button button;
    private TextView textView,txt_print_name,txt_add_contact;
    String name;
    String number;
    public void onCreate(Bundle savedInstance){
        super.onCreate(savedInstance);
        setContentView(R.layout.main);
        textView=(TextView)findViewById(R.id.txt_print);
        txt_add_contact=(TextView)findViewById(R.id.txt_add_contact);
        txt_print_name=(TextView)findViewById(R.id.txt_print_name);
        // Retrieve data from MainActivity on item click event
        Intent i = getIntent();
        // Get the results of rank
        name = i.getStringExtra("name");//檢索來自意圖擴展的數據
        // Get the results of country
        number = i.getStringExtra("number");//檢索來自意圖擴展的數據

        txt_add_contact.setText(name);
        txt_print_name.setText(number);

        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent_select_contact = new Intent(Main.this,MainActivity.class);
                startActivity(intent_select_contact);

            }
        });
    }

}
MainActivity.java
package com.androidbegin.filterlistviewtutorial;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Locale;

public class MainActivity extends Activity {

    // Declare Variables
    ListView list;
    ListViewAdapter adapter;
    EditText editsearch;
    TextView textView;
    String[] name;//儲存連絡人名子
    String[] number;//儲存連絡人電話
    int c = 0;
    int totalpeople = 0;
    ArrayList arraylist = new ArrayList();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_main);
        textView = (TextView) findViewById(R.id.textView);
        /*取得聯絡人姓名和電話*/
        getPhoneBookData();

        String s = String.valueOf(totalpeople);
        textView.setText(s);
        list = (ListView) findViewById(R.id.listview);
        // Pass results to ListViewAdapter Class
        adapter = new ListViewAdapter(this, arraylist);
        // Binds the Adapter to the ListView
        list.setAdapter(adapter);
        // Locate the EditText in listview_main.xml
        editsearch = (EditText) findViewById(R.id.search);
        // Capture Text in EditText
        editsearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                String text = editsearch.getText().toString().toLowerCase(Locale.getDefault());
                adapter.filter(text);
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                                          int arg2, int arg3) {
                // TODO Auto-generated method stub
            }

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
                // TODO Auto-generated method stub
            }
        });
    }

    public void getPhoneBookData() {

        Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        totalpeople = cursor.getCount();//聯絡人總人數
        name = new String[totalpeople];
        number = new String[totalpeople];

        while (cursor.moveToNext()) {
            name[c] = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            number[c] = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            c++;
            if (totalpeople == c) {
                for (int i = 0; i < name.length; i++) {
                    WorldPopulation wp = new WorldPopulation(name[i], number[i]);
                    // Binds all strings into an array
                    arraylist.add(wp);//把資料加入WorldPopulation創建的wp
                }
                break;
            }

        }

    }

}
ListViewAdapter.java
package com.androidbegin.filterlistviewtutorial;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class ListViewAdapter extends BaseAdapter {

    // Declare Variables
    Context mContext;
    LayoutInflater inflater;
    private List worldpopulationlist = null;
    private ArrayList arraylist;

    public ListViewAdapter(Context context, List worldpopulationlist) {
        mContext = context;
        this.worldpopulationlist = worldpopulationlist;
        inflater = LayoutInflater.from(mContext);
        this.arraylist = new ArrayList();
        this.arraylist.addAll(worldpopulationlist);
    }

    public class ViewHolder {
        TextView txt_name;
        TextView txt_number;

    }

    @Override
    public int getCount() {
        return worldpopulationlist.size();
    }//worldpopulationlist資料的數量

    @Override
    public WorldPopulation getItem(int position) {
        return worldpopulationlist.get(position);//worldpopulationlist資料的位置
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(final int position, View view, ViewGroup parent) {
        final ViewHolder holder;
        if (view == null) {
            holder = new ViewHolder();
            view = inflater.inflate(R.layout.listview_item, null);
            // Locate the TextViews in listview_item.xml
            holder.txt_name = (TextView) view.findViewById(R.id.txt_name);
            holder.txt_number = (TextView) view.findViewById(R.id.txt_number);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        // Set the results into TextViews
        holder.txt_name.setText(worldpopulationlist.get(position).getName());
        holder.txt_number.setText(worldpopulationlist.get(position).getNumber());

        // Listen for ListView Item Click
        view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // Send single item click data to SingleItemView Class
                Intent intent = new Intent(mContext, Main.class);
                // Pass all data rank
                intent.putExtra("name", (worldpopulationlist.get(position).getName()));
                // Pass all data country
                intent.putExtra("number", (worldpopulationlist.get(position).getNumber()));
                mContext.startActivity(intent);
            }
        });

        return view;
    }

    // Filter Class
    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        worldpopulationlist.clear();
        if (charText.length() == 0) {
            worldpopulationlist.addAll(arraylist);
        } else {
            for (WorldPopulation wp : arraylist) {
                if (wp.getName().toLowerCase(Locale.getDefault()).contains(charText)) {
                    worldpopulationlist.add(wp);
                }
            }
        }
        notifyDataSetChanged();

    }

}
WorldPopulatio.java
package com.androidbegin.filterlistviewtutorial;
public class WorldPopulation {
 private String name;
 private String number;

 public WorldPopulation(String rank, String country) {
  this.name = rank;
  this.number = country;
 }
 public String getName() {
  return this.name;
 }
 public String getNumber() {
  return this.number;
 }

}
參考資料:
http://cookiesp.pixnet.net/blog/post/84190702-android-intent%26bundle-%E5%82%B3%E9%81%9E%E8%B3%87%E6%96%99%28%E5%8C%85%E5%90%AB%E5%82%B3%E9%81%9E%E8%87%AA%E5%AE%9A%E7%BE%A9%E7%89%A9
http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/

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);
            }
        };



}

2015年2月17日 星期二

UI用戶界面

FrameLayout:是指定一塊區域,也就是說保留一個區塊放元件,所有放在上面的元件都會被放置在FrameLayout的左上角,如果說把多個元件一起放在FrameLayout中,那麼這些控制項會一個一個疊在一起。
sample_frame_layout.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主要用來呈現一個固定的區塊,這裡載入一張圖片,同時載入不同圖片將會被覆蓋-->
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <!--圖片檔名要英文,並且照片需放在mipmap的四個資料夾中-->
        <ImageView
            android:src="@mipmap/tr"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageView" />
    </FrameLayout>
</LinearLayout>
LinearLayout:是最常用的一種Layout,可設定成horizontal水平或者是vertical垂直左右排列。
sample_linear_layout.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:orientation="vertical">
    <!--這裡特別注意layout_weight被定成1,與下面的另一個layout的weight是一樣的,呈現時就會1:1-->
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:text="New Text"
            android:id="@+id/textView5"
            android:background="#ffff201b" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:text="New Text"
            android:id="@+id/textView6"
            android:background="#ff08ff1d" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:text="New Text"
            android:id="@+id/textView7"
            android:background="#ff1227ff" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:text="New Text"
            android:id="@+id/textView8"
            android:background="#ff940cff" />
    </LinearLayout>

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

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="9pt"
            android:text="New Text"
            android:id="@+id/textView" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="12pt"
            android:text="New Text"
            android:id="@+id/textView2" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15pt"
            android:text="New Text"
            android:id="@+id/textView3" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18pt"
            android:text="New Text"
            android:id="@+id/textView4" />
    </LinearLayout>



</LinearLayout>

RelativeLayout:顧名思義就相對位置的版面配置。

sample_relative_layout.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">
    <!--RelativeLayout顧名思議就是相對位置-->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="我是TextView控制項"
            android:id="@+id/textView9"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true" />

        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/button"
            android:layout_below="@+id/textView9"
            android:layout_alignParentStart="true" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/button2"
            android:layout_below="@+id/button"
            android:layout_centerHorizontal="true" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/button3"
            android:layout_alignTop="@+id/button2"
            android:layout_alignParentEnd="true" />

    </RelativeLayout>

</LinearLayout>

TableLayout:顧名思義就像是表格般的版面配置

sample_table_layout.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">


    <TableLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent">

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

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Name"
                android:id="@+id/textView10" />

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

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

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TEL"
                android:id="@+id/textView11" />

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

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

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

2015年2月15日 星期日

Android常用控制項運用

範例說明
主畫面配置幾個Button控制項,每個Button按下去以後顯示另外的畫面呈現另外的基本控制項。

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=".AppMain">

    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/scrollView" >

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

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="按鈕控制項"
                android:id="@+id/btn_Button"
                android:layout_below="@+id/textView"
                android:layout_toEndOf="@+id/scrollView" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="顯示文字控制項"
                android:id="@+id/btn_TextView"
                android:layout_below="@+id/button"
                android:layout_toEndOf="@+id/scrollView" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="編輯文字控制項"
                android:id="@+id/btn_Edit_Text"
                android:layout_below="@+id/button2"
                android:layout_toEndOf="@+id/scrollView" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="勾選式控制項"
                android:id="@+id/btn_Check_Box" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="點選式控制項"
                android:id="@+id/btn_Raid_Grop" />
        </LinearLayout>
    </ScrollView>

</RelativeLayout>

AppMain.java

package com.example.win7.button_activity;

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 AppMain extends Activity {
    private Button btn_Button,btn_TextView,btn_Edit_Text,btn_Check_Box,btn_Raid_Grop;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        setupViewComponent();
    }
    private void setupViewComponent(){
        btn_Button=(Button)findViewById(R.id.btn_Button);
        btn_TextView=(Button)findViewById(R.id.btn_TextView);
        btn_Edit_Text=(Button)findViewById(R.id.btn_Edit_Text);
        btn_Check_Box=(Button)findViewById(R.id.btn_Check_Box);
        btn_Raid_Grop=(Button)findViewById(R.id.btn_Raid_Grop);

        btn_Button.setOnClickListener(Press_Button);
        btn_TextView.setOnClickListener(Press_TexView);
        btn_Edit_Text.setOnClickListener(Press_EditText);
        btn_Check_Box.setOnClickListener(Press_CheckBox);
        btn_Raid_Grop.setOnClickListener(Press_Raid_Grop);
    }
    private Button.OnClickListener Press_Button = new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            /*Andioid切換畫面是用Intentj物件*/
            Intent intent_Button = new Intent();
            /*使用Intent的setclass()來設定目前以及將轉換的Activity*/
            intent_Button.setClass(AppMain.this,SampleButton.class);
            /*startActivity()方法將剛剛設定好的Intent傳遞進去*/
            startActivity(intent_Button);
        }
    };

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

        @Override
        public void onClick(View view) {
            Intent intent_TextView = new Intent();
            intent_TextView.setClass(AppMain.this,SampleTextView.class);
            startActivity(intent_TextView);
        }
    };

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

        @Override
        public void onClick(View view) {
            Intent intent_EdistText = new Intent();
            intent_EdistText.setClass(AppMain.this,SampleEditText.class);
            startActivity(intent_EdistText);
        }
    };

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

        @Override
        public void onClick(View view) {
            Intent intent_RaidGrop = new Intent();
            intent_RaidGrop.setClass(AppMain.this,SampleRaidGrop.class);
            startActivity(intent_RaidGrop);
        }
    };

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

        @Override
        public void onClick(View view) {
            Intent intent_CheckBox = new Intent();
            intent_CheckBox.setClass(AppMain.this,SampleCheckBox.class);
            startActivity(intent_CheckBox);
        }
    };
    @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_app_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_button.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">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="點我點我"
        android:id="@+id/btn_Click" />

</LinearLayout>

SampleButton.java
package com.example.win7.button_activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * Created by win7 on 2015/2/15.
 */
public class SampleButton extends Activity {
    private Button btn_Click;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_button);
        setupViewComponent();
    }

    private void setupViewComponent() {
        btn_Click = (Button) findViewById(R.id.btn_Click);
        btn_Click.setOnClickListener(ClickButton);
    }

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

        @Override
        public void onClick(View view) {
            setTitle("Button以被點選");
        }
    };
}
sample_edit_text.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="fill_parent"
        android:layout_height="352dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Name"
            android:id="@+id/txv_Name" />

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

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="取得EditView中的內容"
            android:id="@+id/btn_Get_Edit_Text" />
    </LinearLayout>

</LinearLayout>

SampleEditText.java
package com.example.win7.button_activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

/**
 * Created by win7 on 2015/2/15.
 */
public class SampleEditText extends Activity {
    private Button btn_Get_Edit_Text;
    private TextView txv_Name;
    private EditText edt_Name;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_edit_text);
        setupViewComponent();
    }

    private void setupViewComponent() {
        btn_Get_Edit_Text = (Button) findViewById(R.id.btn_Get_Edit_Text);
        txv_Name = (TextView) findViewById(R.id.txv_Name);
        edt_Name = (EditText) findViewById(R.id.edt_Name);

        btn_Get_Edit_Text.setOnClickListener(Get_EditText);
    }

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

        @Override
        public void onClick(View view) {
            setTitle("輸入的名稱為:"+edt_Name.getText());
        }
    };
}
sample_check_box.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="fill_parent"
        android:layout_height="fill_parent">

        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Apple"
            android:id="@+id/cb_Apple" />

        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Movie"
            android:id="@+id/cb_Movie" />

        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TV"
            android:id="@+id/cb_TV" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="取得目前被選擇的值"
            android:id="@+id/btn_Select"/>
    </LinearLayout>
</LinearLayout>
SampleCheckBox.java
package com.example.win7.button_activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;

/**
 * Created by win7 on 2015/2/15.
 */
public class SampleCheckBox extends Activity {
    private CheckBox cb_Apple,cb_Movie,cb_TV;
    private Button btn_Select;
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_check_box);
        setTitle("這是CheckBox的Activity");
        setupViewComponent();
    }
    private void setupViewComponent(){
        cb_Apple=(CheckBox)findViewById(R.id.cb_Apple);
        cb_Movie=(CheckBox)findViewById(R.id.cb_Movie);
        cb_TV=(CheckBox)findViewById(R.id.cb_TV);
        btn_Select=(Button)findViewById(R.id.btn_Select);
        btn_Select.setOnClickListener(Check_Select);
    }
    private Button.OnClickListener Check_Select = new Button.OnClickListener(){
        public void onClick(View view){
            String s_Checked="";
            /*接字串符號+=*/
            if(cb_Apple.isChecked()){
                s_Checked+=cb_Apple.getText()+",";
            }
            if(cb_Movie.isChecked()){
                s_Checked+=cb_Movie.getText()+",";
            }
            if(cb_TV.isChecked()){
                s_Checked+=cb_TV.getText()+",";
            }
            setTitle("Checked:"+s_Checked);
        }

    };
}

sample_radio_group.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="fill_parent"
        android:layout_height="fill_parent">

        <RadioGroup
            android:id="@+id/rdg_Main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Apple"
                android:id="@+id/rdg_Apple" />

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Movie"
                android:id="@+id/rdg_Movie" />

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TV"
                android:id="@+id/rdg_TV" />
        </RadioGroup>
    </LinearLayout>

</LinearLayout>
SampleRadioGroup.java
package com.example.win7.button_activity;

import android.app.Activity;
import android.os.Bundle;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;

/**
 * Created by win7 on 2015/2/15.
 */
public class SampleRaidGrop extends Activity {
    /*宣告一個控制項,和三個控制項*/
    private RadioGroup rdg_Main;
    private RadioButton rdg_Apple,rdg_Movie,rdg_TV;
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_radio_group);
        setTitle("這是RadioButton的Activity");
        setupViewComponent();
    }
    private void setupViewComponent(){
        rdg_Main=(RadioGroup)findViewById(R.id.rdg_Main);
        rdg_Apple=(RadioButton)findViewById(R.id.rdg_Apple);
        rdg_Movie=(RadioButton)findViewById(R.id.rdg_Movie);
        rdg_TV=(RadioButton)findViewById(R.id.rdg_TV);
        rdg_Main.setOnCheckedChangeListener(Check_Radio);
    }
    /*這裡特別注意RadipGroup所使用的事件是OnCheckedChangeListener*/
    private RadioGroup.OnCheckedChangeListener Check_Radio = new RadioGroup.OnCheckedChangeListener(){

        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int i) {
            if(i==rdg_Apple.getId()){
                setTitle("我的喜好:"+rdg_Apple.getText());
            }
            else if(i==rdg_Movie.getId()){
                setTitle("我的喜好:"+rdg_Movie.getText());
            }
            else if(i==rdg_TV.getId()){
                setTitle("我的喜好:"+rdg_TV.getText());
            }
        }
    };
}

2015年2月14日 星期六

Activity

Activity就是代表一個畫面所有的動作和內容,它也是一個被繼承的母類別,一但繼承了它就可以是一個被執行且啟動的畫面,畫面的切換也是Activity的切換,在Android中Activity的切換分為幾種,一種是單純的切換,一種是帶有資料的切換,還有一種是切換以後還要切換回原來的Activity,以下範例展是單純切換,還有帶資料並且切換原來的Activity。

主要功能
主畫面配置兩個按鈕,兩個按鈕都會切換到新的Activity並且載入新的Layout不同的是一個有登記回呼的方法,有登記回呼的Button可以在Activity結束的時候傳遞資訊回到原本Activity中並且將資訊顯是在畫面上。

重點觀念
開啟一個新的Activity主要有兩種方法,一種是只有傳遞資料與狀態給下一個Activity,另一種還可讓下一個Activity傳遞資料回到原本的Activity,這兩種方法為呼叫startActivity()方法與呼叫startActivityForResult()方法。

startActivity():啟動另一個活動可以說是一去不復返,單純啟動另一個活動

startActivityForResult():是透過覆寫onActivityResult()方法,當這個方法被覆寫了以後,新的Activity呼叫setResult()方法及finish()方法以後就會被回呼,並根據setResult()方法呼叫時所傳遞的參數來接收新的Activity所回傳的資料或資訊,來做後續的動作。


程式碼中建立新的 Activity 類別檔案

其實很簡單需做以下三件事
1.新增一個java (在src/ 下面)  
2.新增一個.xml (在res/layou/ 下面)
3.在AndroidManifest.xml (裡面加入一段敘述)
1.新增java
首先在專案目錄上點右鍵,選擇「New->Class」選項,會出現一個New Java Class的視窗
在Package那爛的右邊Browse點取,選取我們的路徑(一開始我們所創的路徑)
在Name輸入新的檔案名(注意第一個字母需大寫)
接下來在Superclass那欄右手邊的Browse點開
在Choose a type 輸入activity 將會出現Activity-android.app選取 按OK  Finish 。
2.新增.xml
首先在專案目錄上點右鍵,選擇「New->Other->Android->Android XML File」選項
會出現New Android XML File 的視窗
首先選取你的Project  ,File輸入你的檔案名稱(注意後面需+.xml    EX:test.xml)
在下面選取Layout  在點Finish  。
3.AndroidManifest.xml
在我們左邊Navigator(預設的位置)  專案下會有一個名為AndroidManifest.xml 的檔案
雙擊開啟它,在點選下面AndroidManifest.xml模式,下入下面這段敘述
加入:<activity android:name="Activitysample2"></activity>//新增的JAVA檔

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:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="呼叫 Activity1"
        android:id="@+id/btn_Call_Activity1"
        android:layout_below="@+id/textView"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="呼叫 Activity2"
        android:id="@+id/btn_Call_Activity2"
        android:layout_below="@+id/btn_Call_Activity1"
        android:layout_alignParentStart="true" />

</RelativeLayout>

MainActivity.java

package com.example.win7.helloworld;
/*appMain*/
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;


/*繼承Activity類別*/
public class MainActivity extends Activity {
    private  Button btn_Call_Activity1;
    private  Button btn_Call_Activity2;
    static final int REQUEST_CODE=1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setupViewComponent();
    }

    private void setupViewComponent(){
        btn_Call_Activity1=(Button)findViewById(R.id.btn_Call_Activity1);
        btn_Call_Activity2=(Button)findViewById(R.id.btn_Call_Activity2);
        btn_Call_Activity1.setOnClickListener(Call_Activity1);
        btn_Call_Activity2.setOnClickListener(Call_Activity2);
    }
    private Button.OnClickListener Call_Activity1=new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            /*實體化Intent物件,第一個參數載入目前所在的context,第二個參數傳入頁面切換的目的地的class*/
            Intent intent1 = new Intent(MainActivity.this,SampleActivity1.class );
            /*呼叫Intent類別的putExtra方法,第一個字串參數是參數名稱,第二個字串參數是參數值*/
            intent1.putExtra("FromAppMain","appMain");
            /*呼叫Activity的startActivityForResult方法,將前面實體化的Intent物件參考傳入,並且將從Activity繼承而來的REQUEST_CODE變數參考傳入,以記錄一些狀態在返回以後取出使用*/
            startActivityForResult(intent1,REQUEST_CODE);
        }
    };
    private Button.OnClickListener Call_Activity2=new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
           setTitle("目前是由Activity2所返回");
            Intent intent2=new Intent(MainActivity.this,SampleActivity2.class);
            /*切換Activity*/
            startActivity(intent2);
        }
    };
    /*onActivityResult()方法是覆寫用來當新的Activity結束以後被自動回呼,如此一來就可以透過傳遞回來的參數來取得新的Activity,
            要注意的事覆寫onActivityResult()方法的同時,起動新的Activity要使用startActivityForResult()方法,否則就無法自動會呼,
            另外第一個參數用來承載新的Activity的狀態,第二個參數用來承載新的Activity要傳遞給原來的Activity的資料*/
    protected void onActivityResult(int requestCode,int resultCode,Intent date){
        if(requestCode==REQUEST_CODE)
        {
            if(resultCode==RESULT_OK){
                String temp=null;
                /*呼叫Intent的getExtras()方法取得Bundle物件可以用來裝載其他的物件,這些物件經過適當的轉型就可以拿來使用*/
                Bundle extras=date.getExtras();
                if(extras!=null){
                    temp=extras.getString("FromActivity1");
                }
                setTitle(temp);
            }
        }
    }
    @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_activity1.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="fill_parent">

        <TextView
            android:layout_width="369dp"
            android:layout_height="112dp"
            android:id="@+id/txv_Activity1" />

        <Button
            android:layout_width="288dp"
            android:layout_height="wrap_content"
            android:text="返回主畫面"
            android:id="@+id/btn_Activity1_BackTo_MainActivity" />
    </LinearLayout>

</LinearLayout>
SampleActivity1.java
package com.example.win7.helloworld;

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

/**
 * Created by win7 on 2015/2/14.
 */
public class SampleActivity1 extends Activity{
        private Button btn_Activity_BackTo_MainActivity;
        private TextView txv_Activity1;
        Bundle bul_Extra;
        String s_ActivityDate=null;
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_activity1);
        setTitle("目前是由Activity1");
        setupViewComponent();
    }
    private void setupViewComponent(){
        txv_Activity1=(TextView)findViewById(R.id.txv_Activity1);
        btn_Activity_BackTo_MainActivity=(Button)findViewById(R.id.btn_Activity1_BackTo_MainActivity);
        btn_Activity_BackTo_MainActivity.setOnClickListener(Activity1);
        /*呼叫getIntent()方法取得用來啟動這個Activity的Intent物件,再對其呼叫getExtras()方法取得其中用來傳遞資料的bundle物件*/
        bul_Extra=getIntent().getExtras();

        if(bul_Extra!=null){
            /*呼叫Bundle的getSting()方法取得放在裡面的字串,並且指派給s_ActivityDate變數*/
            s_ActivityDate=bul_Extra.getString("FromAppMain");
        }
        txv_Activity1.setText("資料是由"+s_ActivityDate+"所傳入");
    }
    private Button.OnClickListener Activity1=new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            /*實體化Bundle物件,呼叫其putSttring()方法將文字傳入,用Buundle物件作韋Activity切換時候傳遞資訊的載具*/
            Bundle bundle=new Bundle();
            bundle.putString("FromActivity1","目前是由Activity1所返回");
            /*建立一個Intent物件,使用期作為Activity轉換工具物件*/
            Intent mIntent = new Intent();
            /*使用bundle物件來裝載要在Activity間傳遞資料,呼叫putExtra()方法將Bundle物件放入Intent物件中*/
            mIntent.putExtras(bundle);
            /*呼叫setResult()方法,第一個參數傳入目前Activity執行的結果,第二個參數放入要傳回給原來的Activity的Intent物件*/
            setResult(RESULT_OK,mIntent);
            finish();//結束目前的Activity
        }
    };
}

sample_activity2.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">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="返回主畫面"
        android:id="@+id/btn_Activity2_BackTo_MainActivity" />
</LinearLayout>
SampleActivity2.java
package com.example.win7.helloworld;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * Created by win7 on 2015/2/14.
 */
public class SampleActivity2 extends Activity {
        private Button btn_Activity2_BackTo_MainActivity;
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_activity2);
        setTitle("目前是由Activity2");
        setupViewComponent();
    }

    private void setupViewComponent(){
        btn_Activity2_BackTo_MainActivity=(Button)findViewById(R.id.btn_Activity2_BackTo_MainActivity);
        btn_Activity2_BackTo_MainActivity.setOnClickListener(Activity2);
    }
    private  Button.OnClickListener Activity2=new Button.OnClickListener() {
        @Override
        public void onClick(View view) {
            /*與第一個Activity不同的是這個Activity就直接結束,並沒有處理回呼所要傳遞的資料,也沒有呼叫setResult()方法去設定執行的結果狀態*/
            finish();
        }
    };
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.win7.helloworld" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/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>
        <activity android:name=".SampleActivity1"></activity>
        <activity android:name=".SampleActivity2"></activity>
    </application>

</manifest>