Android中Activity的使用,簡單實例講解

衆所周知,Activity組件是Andorid應用中最重要,最常見的應用組件!Android應用開發的一個重要組成部分就是開發Activity,下面我將會記錄下Activity的開發!

實例1圖:
Activity
實例用第二個Activity處理註冊信息
Bundle
實例用第二個Activity讓用戶選擇信息
ActivityForResult

結構圖如下:
Context

啓動、關閉Activity

啓動Activity有如下兩個方法:
1:startActivity(Intent intent):
2:startActivityForResult(Intent intent , int resquestCode):
關閉Activity有如下兩種方法
1:finish();
2:finishActivity(int requestCode):結束指定的Activity;

Activity的四種加載模式

  1. standard:會在Task中啓動多次Activity實例
  2. singleTop:當需要啓動的Activity實例位於Task棧頂時,再次啓動將不回創建新的Activity實例
  3. singleTask:在同一個Task內,若Activity不存在,則創建!若需要啓動的Activity位於棧頂,則Task內無變化!若不位於棧頂,則將位於該Activity上的所有Activity移出Task,將目標Activity位於棧頂!
  4. singleInstance:無論從哪個Task中啓動目標Activity,只會創建一個目標Activity實例,並且會使用一個全新的棧來加載該Activity實例。
    分兩種情況:
    1.如果將要啓動的Activity不存在,系統會先創建一個全新的Task,再創建木匾Activity實例,並將它加入新的Task棧頂
    2.如果將要啓動的Activity存在,無論他在哪個應用中,系統都會把該Activit所在的Task轉到前臺,從而使Activity顯示出來!

使用Bundle在Activity之間進行交互數據

當一個Activity的時候,通常需要攜帶一部分數據,而攜帶數據的信使就是intent,因此我們需要把需要傳遞的數據放在Intent中:
Intent提供多個重載方法,如下:
1:putExtra(Bundle data);向Intent中放入數據
2:Bundle getExtra():從Intent中取出數據
3:putExtra(String name,Xxx value);向Intent中按key_value鍵值對的形式存入數據
4:getXXXExtra(String name):指定的key,取出數據

注意:Intent的putExtra()方法使智能的,當該Intent中如果存在Bundle對象,則直接將需要存入的數據存入到該Bundle中,如果沒有,則會自動創建一個Bundle來存放數據

實例:用第二個Activity處理註冊信息

Activity代碼:

public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button bn = (Button) findViewById(R.id.bn);
        bn.setOnClickListener(new OnClickListener()
        {
            public void onClick(View v)
            {
                EditText name = (EditText)findViewById(R.id.name);
                EditText passwd = (EditText)findViewById(R.id.passwd);
                RadioButton male = (RadioButton) findViewById(R.id.male);
                String gender = male.isChecked() ? "男 " : "女";
                Person p = new Person(name.getText().toString(), passwd
                        .getText().toString(), gender);
                // 創建一個Bundle對象
                Bundle data = new Bundle();
                data.putSerializable("person", p);
                // 創建一個Intent
                Intent intent = new Intent(MainActivity.this,
                        ResultActivity.class);
                intent.putExtras(data);
                // 啓動intent對應的Activity
                startActivity(intent);
            }
        });
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="請輸入您的註冊信息"
        android:textSize="20sp"/>
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="用戶名:"
            android:textSize="16sp"/>
        <!-- 定義一個EditText,用於收集用戶的賬號 -->
        <EditText
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="請填寫想註冊的賬號"
            android:selectAllOnFocus="true"/>
    </TableRow>
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="密碼:"
            android:textSize="16sp"/>
        <!-- 用於收集用戶的密碼 -->
        <EditText
            android:id="@+id/passwd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:password="true"
            android:selectAllOnFocus="true"/>
    </TableRow>
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="性別:"
            android:textSize="16sp"/>
        <!-- 定義一組單選框,用於收集用戶註冊的性別 -->
        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <RadioButton
                android:id="@+id/male"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="男"
                android:textSize="16sp"/>
            <RadioButton
                android:id="@+id/female"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="女"
                android:textSize="16sp"/>
        </RadioGroup>
    </TableRow>
    <Button
        android:id="@+id/bn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="註冊"
        android:textSize="16sp"/>
</TableLayout>

實例:用第二個Activity讓用戶選擇信息

MainActivity代碼:

public class MainActivity extends Activity
{
    Button bn;
    EditText city;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 獲取界面上的組件
        bn = (Button) findViewById(R.id.bn);
        city = (EditText) findViewById(R.id.city);
        // 爲按鈕綁定事件監聽器
        bn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                // 創建需要對應於目標Activity的Intent
                Intent intent = new Intent(MainActivity.this,
                        SelectCityActivity.class);
                // 啓動指定Activity並等待返回的結果,其中0是請求碼,用於標識該請求
                startActivityForResult(intent, 0);
            }
        });
    }
    // 重寫該方法,該方法以回調的方式來獲取指定Activity返回的結果
    @Override
    public void onActivityResult(int requestCode
            , int resultCode, Intent intent)
    {
        // 當requestCode、resultCode同時爲0時,也就是處理特定的結果
        if (requestCode == 0 && resultCode == 0)
        {
            // 取出Intent裏的Extras數據
            Bundle data = intent.getExtras();
            // 取出Bundle中的數據
            String resultCity = data.getString("city");
            // 修改city文本框的內容
            city.setText(resultCity);
        }
    }
}

SelectCityActivity代碼:

public class SelectCityActivity extends ExpandableListActivity
{
    // 定義省份數組
    private String[] provinces = new String[]
        { "廣東", "廣西", "湖南"};
    private String[][] cities = new String[][]
        {
            { "廣州", "深圳", "珠海", "中山" },
            { "桂林", "柳州", "南寧", "北海" },
            { "長沙", "岳陽" , "衡陽" , "株洲" }
        };
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ExpandableListAdapter adapter = new BaseExpandableListAdapter()
        {
            // 獲取指定組位置、指定子列表項處的子列表項數據
            @Override
            public Object getChild(int groupPosition, int childPosition)
            {
                return cities[groupPosition][childPosition];
            }
            @Override
            public long getChildId(int groupPosition, int childPosition)
            {
                return childPosition;
            }
            @Override
            public int getChildrenCount(int groupPosition)
            {
                return cities[groupPosition].length;
            }
            private TextView getTextView()
            {
                AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT, 64);
                TextView textView = new TextView(SelectCityActivity.this);
                textView.setLayoutParams(lp);
                textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                textView.setPadding(36, 0, 0, 0);
                textView.setTextSize(20);
                return textView;
            }
            // 該方法決定每個子選項的外觀
            @Override
            public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent)
            {
                TextView textView = getTextView();
                textView.setText(getChild(groupPosition, childPosition)
                        .toString());
                return textView;
            }
            // 獲取指定組位置處的組數據
            @Override
            public Object getGroup(int groupPosition)
            {
                return provinces[groupPosition];
            }
            @Override
            public int getGroupCount()
            {
                return provinces.length;
            }
            @Override
            public long getGroupId(int groupPosition)
            {
                return groupPosition;
            }
            // 該方法決定每個組選項的外觀
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent)
            {
                LinearLayout ll = new LinearLayout(SelectCityActivity.this);
                ll.setOrientation(LinearLayout.HORIZONTAL);
                ImageView logo = new ImageView(SelectCityActivity.this);
                ll.addView(logo);
                TextView textView = getTextView();
                textView.setText(getGroup(groupPosition).toString());
                ll.addView(textView);
                return ll;
            }
            @Override
            public boolean isChildSelectable(int groupPosition,
                int childPosition)
            {
                return true;
            }
            @Override
            public boolean hasStableIds()
            {
                return true;
            }
        };
        // 設置該窗口顯示列表
        setListAdapter(adapter);
        getExpandableListView().setOnChildClickListener(
            new OnChildClickListener()
            {
                @Override
                public boolean onChildClick(ExpandableListView parent,
                    View source, int groupPosition, int childPosition,
                                            long id)
                {
                    // 獲取啓動該Activity之前的Activity對應的Intent
                    Intent intent = getIntent();
                    intent.putExtra("city",
                            cities[groupPosition][childPosition]);
                    // 設置該SelectCityActivity的結果碼,並設置結束之後退回的Activity
                    SelectCityActivity.this.setResult(0, intent);
                    // 結束SelectCityActivity。
                    SelectCityActivity.this.finish();
                    return false;
                }
            });
    }
}

實例一

用LauncherActivity開發Activity的列表

看結構圖可以看出,LauncherActivity繼承自ListActivity,因此本質上也是一個開發列表界面的Activity,這裏就不做多陳述,直接上代碼

Activity代碼

public class MainActivity extends LauncherActivity
{
    //定義兩個Activity的名稱
    String[] names = {"設置程序參數" ,  "查看星際兵種"};
    //定義兩個Activity對應的實現類
    Class<?>[] clazzs = {PreferenceActivityTest.class
            , ExpandableListActivityTest.class};
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1 , names);
        // 設置該窗口顯示的列表所需的Adapter
        setListAdapter(adapter);
    }
    //根據列表項返回指定Activity對應的Intent
    @Override
    public Intent intentForPosition(int position)
    {
        return new Intent(MainActivity.this , clazzs[position]);
    }
}

使用ExpandableListActvity實現可展開的Activity

ExpandableListActivity的用法和ExpandableView的用法基本相似,只要爲該Activity傳入一個ExpandableListAdapter對象即可,接下來ExpandableListActivity將會生成一個顯示可展開列表窗口

Activity代碼:

public class ExpandableListActivityTest extends ExpandableListActivity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ExpandableListAdapter adapter = new BaseExpandableListAdapter()
        {
            int[] logos = new int[]
                    {
                            R.drawable.p,
                            R.drawable.z,
                            R.drawable.t
                    };
            private String[] armTypes = new String[]
                    { "神族兵種", "蟲族兵種", "人族兵種"};
            private String[][] arms = new String[][]
                    {
                            { "狂戰士", "龍騎士", "黑暗聖堂", "電兵" },
                            { "小狗", "刺蛇", "飛龍", "自爆飛機" },
                            { "機槍兵", "護士MM" , "幽靈" }
                    };
            //獲取指定組位置、指定子列表項處的子列表項數據
            @Override
            public Object getChild(int groupPosition, int childPosition)
            {
                return arms[groupPosition][childPosition];
            }
            @Override
            public long getChildId(int groupPosition, int childPosition)
            {
                return childPosition;
            }
            @Override
            public int getChildrenCount(int groupPosition)
            {
                return arms[groupPosition].length;
            }
            private TextView getTextView()
            {
                AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT, 64);
                TextView textView = new TextView(ExpandableListActivityTest.
                        this);
                textView.setLayoutParams(lp);
                textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                textView.setPadding(36, 0, 0, 0);
                textView.setTextSize(20);
                return textView;
            }
            //該方法決定每個子選項的外觀
            @Override
            public View getChildView(int groupPosition, int childPosition,
                                     boolean isLastChild, View convertView, ViewGroup parent)
            {
                TextView textView = getTextView();
                textView.setText(getChild(groupPosition, childPosition).
                        toString());
                return textView;
            }
            //獲取指定組位置處的組數據
            @Override
            public Object getGroup(int groupPosition)
            {
                return armTypes[groupPosition];
            }
            @Override
            public int getGroupCount()
            {
                return armTypes.length;
            }
            @Override
            public long getGroupId(int groupPosition)
            {
                return groupPosition;
            }
            //該方法決定每個組選項的外觀
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded,
                                     View convertView, ViewGroup parent)
            {
                LinearLayout ll = new LinearLayout(
                        ExpandableListActivityTest.this);
                ll.setOrientation(LinearLayout.HORIZONTAL);
                ImageView logo = new ImageView(
                        ExpandableListActivityTest.this);
                logo.setImageResource(logos[groupPosition]);
                ll.addView(logo);
                TextView textView = getTextView();
                textView.setText(getGroup(groupPosition).toString());
                ll.addView(textView);
                return ll;
            }
            @Override
            public boolean isChildSelectable(int groupPosition,
                                             int childPosition)
            {
                return true;
            }
            @Override
            public boolean hasStableIds()
            {
                return true;
            }
        };
        // 設置該窗口顯示列表
        setListAdapter(adapter);
    }
}

PreferenceActivity結合PreferenceFragment實現參數設置界面

PreferenceActivity從名字就能看出其作用!用來設置參數時使用的!
在Android3.0之前,PreferenceActivity採用加載選項設置的佈局文件。
其中PreferenceActivity只負責加載選項設置列表的佈局文件,PreferenceFragment才負責加載選項設置的佈局文件。

參數:

PreferenceCategory:用於對參數進行分組
CheckBoxPreference:複選框參數
EditTextPreference:文本框輸入參數
ListPreference:列表框輸入參數
MultiSelectListPreference:多選列表框輸入參數
PreferenceCategory:參數組
Preference:僅供顯示的參數
PreferenceScreen:根元素
RingtonePreference:系統鈴聲選擇
SwitchPreference:開關輸入參數

使用方法:

1.讓Fragment繼承自PreferenceFragment。
2.在onCreate(Bundle savedInstanceState)方法中調用addPreferenceFromResource(……)方法加載指定的佈局文件。

PreferenceActivityTest代碼:

public class PreferenceActivityTest extends PreferenceActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // 該方法用於爲該界面設置一個標題按鈕
        if (hasHeaders())
        {
            Button button = new Button(this);
            button.setText("設置操作");
            // 將該按鈕添加到該界面上
            setListFooter(button);
        }
    }
    // 重寫該該方法,負責加載頁面佈局文件
    @Override
    public void onBuildHeaders(List<Header> target)
    {
        // 加載選項設置列表的佈局文件
        loadHeadersFromResource(R.xml.preference_headers, target);
    }
    // 重寫該方法,驗證各PreferenceFragment是否有效
    @Override
    public boolean isValidFragment(String fragmentName)
    {
        return true;
    }
    public static class Prefs1Fragment extends PreferenceFragment
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
        }
    }
    public static class Prefs2Fragment extends PreferenceFragment
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.display_prefs);
            // 獲取傳入該Fragment的參數
            String website = getArguments().getString("website");
            Toast.makeText(getActivity()
                    , "網站域名是:" + website , Toast.LENGTH_LONG).show();
        }
    }
}

preference_headers.xml代碼:

<?xml version="1.0" encoding="utf-8"?>
<preference-headers
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 指定啓動指定PreferenceFragment的列表項 -->
    <header android:fragment=
                "org.crazyit.app.PreferenceActivityTest$Prefs1Fragment"
            android:icon="@drawable/ic_settings_applications"
            android:title="程序選項設置"
            android:summary="設置應用的相關選項" />
    <!-- 指定啓動指定PreferenceFragment的列表項 -->
    <header android:fragment=
                "org.crazyit.app.PreferenceActivityTest$Prefs2Fragment"
            android:icon="@drawable/ic_settings_display"
            android:title="界面選項設置 "
            android:summary="設置顯示界面的相關選項">
        <!-- 使用extra可向Activity傳入額外的數據 -->
        <extra android:name="website"
               android:value="www.crazyit.org" />
    </header>
    <!-- 使用Intent啓動指定Activity的列表項 -->
    <header
        android:icon="@drawable/ic_settings_display"
        android:title="使用Intent"
        android:summary="使用Intent啓動某個Activity">
        <intent android:action="android.intent.action.VIEW"
                android:data="http://weibo.com/aserbao?source=blog&amp;is_all=1" />
    </header>
</preference-headers>

preferences.xml代碼:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 設置系統鈴聲 -->
    <RingtonePreference
        android:ringtoneType="all"
        android:title="設置鈴聲"
        android:summary="選擇鈴聲(測試RingtonePreference)"
        android:showDefault="true"
        android:key="ring_key"
        android:showSilent="true">
    </RingtonePreference>
    <PreferenceCategory android:title="個人信息設置組">
        <!-- 通過輸入框填寫用戶名 -->
        <EditTextPreference
            android:key="name"
            android:title="填寫用戶名"
            android:summary="填寫您的用戶名(測試EditTextPreference)"
            android:dialogTitle="您所使用的用戶名爲:" />
        <!-- 通過列表框選擇性別 -->
        <ListPreference
            android:key="gender"
            android:title="性別"
            android:summary="選擇您的性別(測試ListPreference)"
            android:dialogTitle="ListPreference"
            android:entries="@array/gender_name_list"
            android:entryValues="@array/gender_value_list" />
    </PreferenceCategory>
    <PreferenceCategory android:title="系統功能設置組 ">
        <CheckBoxPreference
            android:key="autoSave"
            android:title="自動保存進度"
            android:summaryOn="自動保存: 開啓"
            android:summaryOff="自動保存: 關閉"
            android:defaultValue="true" />
    </PreferenceCategory>
</PreferenceScreen>

display_prefs.xml代碼

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="背景燈光組">
    <!-- 通過列表框選擇燈光強度 -->
    <ListPreference
        android:key="light"
        android:title="燈光強度"
        android:summary="請選擇燈光強度(測試ListPreference)"
        android:dialogTitle="請選擇燈光強度"
        android:entries="@array/light_strength_list"
        android:entryValues="@array/light_value_list" />
</PreferenceCategory>
<PreferenceCategory android:title="文字顯示組 ">
    <!-- 通過SwitchPreference設置是否自動滾屏 -->
    <SwitchPreference
        android:key="autoScroll"
        android:title="自動滾屏"
        android:summaryOn="自動滾屏: 開啓"
        android:summaryOff="自動滾屏: 關閉"
        android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章