├── res
├── drawable
│ ├── a.mp3
│ ├── bg.jpg
│ ├── img1.png
│ ├── img2.png
│ ├── img3.png
│ ├── play.png
│ ├── rain.png
│ ├── sun.png
│ ├── Thumbs.db
│ ├── cloudy.png
│ ├── nobody.jpg
│ ├── sample_0.jpg
│ ├── sample_1.jpg
│ ├── sample_10.jpg
│ ├── sample_11.jpg
│ ├── sample_2.jpg
│ ├── sample_3.jpg
│ ├── sample_4.jpg
│ ├── sample_5.jpg
│ ├── sample_6.jpg
│ ├── sample_7.jpg
│ ├── sample_8.jpg
│ ├── sample_9.jpg
│ ├── default_icon.png
│ ├── picture_frame.png
│ └── alert_dialog_icon.png
├── drawable-hdpi
│ └── icon.png
├── drawable-ldpi
│ └── icon.png
├── drawable-mdpi
│ └── icon.png
├── values
│ ├── arrays.xml
│ └── strings.xml
└── layout
│ ├── sub_menu.xml
│ ├── frame_layout.xml
│ ├── grid_view.xml
│ ├── context_menu.xml
│ ├── bundle2.xml
│ ├── relative_linear_left.xml
│ ├── date_picker.xml
│ ├── relative_linear_right.xml
│ ├── image_show.xml
│ ├── tab.xml
│ ├── table_layout.xml
│ ├── auto_complete_text_view.xml
│ ├── alert_dialog.xml
│ ├── spinner.xml
│ ├── radio_group.xml
│ ├── tab_widget.xml
│ ├── check_box.xml
│ ├── relative_layout.xml
│ ├── rating_bar.xml
│ ├── alert_dialog_text_entry.xml
│ ├── notification.xml
│ ├── bundle1.xml
│ ├── progress_bar.xml
│ └── main.xml
├── libs
└── android-support-v4.jar
├── assets
├── sub_menu.xml
├── frame_layout.xml
├── grid_view.xml
├── context_menu.xml
├── relative_linear_left.xml
├── bundle2.xml
├── date_picker.xml
├── relative_linear_right.xml
├── image_show.xml
├── tab.xml
├── table_layout.xml
├── auto_complete_text_view.xml
├── alert_dialog.xml
├── spinner.xml
├── radio_group.xml
├── tab_widget.xml
├── check_box.xml
├── relative_layout.xml
├── rating_bar.xml
├── alert_dialog_text_entry.xml
├── notification.xml
├── bundle1.xml
├── progress_bar.xml
└── main.xml
├── src
└── com
│ ├── cellcom
│ ├── FrameLayoutActivity.java
│ ├── RelativeLayoutActivity.java
│ ├── TableLayoutActivity.java
│ ├── TabDemoActivity.java
│ ├── RatingBarActivity.java
│ ├── RadioGroupActivity.java
│ ├── OptionsMenuActivity.java
│ ├── RelativeAndLinearActivity.java
│ ├── AutoCompleteTextViewActivity.java
│ ├── CheckBoxActivity.java
│ ├── ContextMenuActivity.java
│ ├── Bundle2Activity.java
│ ├── SubMenuActivity.java
│ ├── DatePickerActivity.java
│ ├── GridViewActivity.java
│ ├── Bundle1Activity.java
│ ├── ProgressBarHandlerActivity.java
│ ├── TabWidgetActivity.java
│ ├── SpinnerActivity.java
│ ├── ImageShowActivity.java
│ ├── NotificationActivity.java
│ ├── AlertDialogActivity.java
│ └── MainActivity.java
│ └── roxstudio
│ └── utils
│ └── Util.java
├── .classpath
├── README.md
├── project.properties
├── .project
└── AndroidManifest.xml
/res/drawable/a.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/a.mp3
--------------------------------------------------------------------------------
/res/drawable/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/bg.jpg
--------------------------------------------------------------------------------
/res/drawable/img1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/img1.png
--------------------------------------------------------------------------------
/res/drawable/img2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/img2.png
--------------------------------------------------------------------------------
/res/drawable/img3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/img3.png
--------------------------------------------------------------------------------
/res/drawable/play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/play.png
--------------------------------------------------------------------------------
/res/drawable/rain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/rain.png
--------------------------------------------------------------------------------
/res/drawable/sun.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sun.png
--------------------------------------------------------------------------------
/res/drawable/Thumbs.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/Thumbs.db
--------------------------------------------------------------------------------
/res/drawable/cloudy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/cloudy.png
--------------------------------------------------------------------------------
/res/drawable/nobody.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/nobody.jpg
--------------------------------------------------------------------------------
/res/drawable-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable-hdpi/icon.png
--------------------------------------------------------------------------------
/res/drawable-ldpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable-ldpi/icon.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable-mdpi/icon.png
--------------------------------------------------------------------------------
/res/drawable/sample_0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_0.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_1.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_10.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_11.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_2.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_3.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_4.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_5.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_6.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_7.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_8.jpg
--------------------------------------------------------------------------------
/res/drawable/sample_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/sample_9.jpg
--------------------------------------------------------------------------------
/libs/android-support-v4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/libs/android-support-v4.jar
--------------------------------------------------------------------------------
/res/drawable/default_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/default_icon.png
--------------------------------------------------------------------------------
/res/drawable/picture_frame.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/picture_frame.png
--------------------------------------------------------------------------------
/res/drawable/alert_dialog_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rockswang/proxycomponent/HEAD/res/drawable/alert_dialog_icon.png
--------------------------------------------------------------------------------
/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - AAA
5 | - BBB
6 | - CCC
7 | - DDD
8 | - EEE
9 |
10 |
11 |
--------------------------------------------------------------------------------
/assets/sub_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/assets/frame_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
16 |
17 |
--------------------------------------------------------------------------------
/res/layout/sub_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/res/layout/frame_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
16 |
17 |
--------------------------------------------------------------------------------
/assets/grid_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
16 |
--------------------------------------------------------------------------------
/res/layout/grid_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
16 |
--------------------------------------------------------------------------------
/src/com/cellcom/FrameLayoutActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 |
6 | import com.roxstudio.proxycomponent.Proxied;
7 |
8 | public class FrameLayoutActivity extends Proxied {
9 |
10 | @Override
11 | protected void onCreate(Bundle savedInstanceState) {
12 | // TODO Auto-generated method stub
13 | super.onCreate(savedInstanceState);
14 | setContentView(R.layout.frame_layout);
15 | }
16 |
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/.classpath:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 简介
2 | 实现Android Activity的代理机制,可以实现:
3 |
4 | 1. 在AndroidManifest.xml中仅声明一个代理Activity,即可打开多个被代理Activity
5 | 2. 被代理Activity可以动态更新,即使用DexClassLoader加载的Activity
6 |
7 | # 使用方法
8 | 1. 原派生于Activity的类,其超类需改为Proxied<Activity>
9 | 2. 类中原来需要传入Activity.this,或Context.this的地方,改为传入Activity.this.asActivity()
10 | 3. 在AndroidManifest增加ProxyActivity的声明,其它被代理Activity则可以删除
11 | 4. 如果入口Activity也需要代理,需在AndroidManifest中增加<meta-data android:name="PROXIED_ACTIVITY_CLASS_NAME" android:value="被代理Activity类名"/>
12 |
13 |
--------------------------------------------------------------------------------
/src/com/cellcom/RelativeLayoutActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 |
6 | import com.roxstudio.proxycomponent.Proxied;
7 |
8 | public class RelativeLayoutActivity extends Proxied {
9 |
10 | @Override
11 | protected void onCreate(Bundle savedInstanceState) {
12 | // TODO Auto-generated method stub
13 | super.onCreate(savedInstanceState);
14 |
15 | setContentView(R.layout.relative_layout);
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/src/com/cellcom/TableLayoutActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 |
6 | import com.roxstudio.proxycomponent.Proxied;
7 |
8 | public class TableLayoutActivity extends Proxied {
9 |
10 | @Override
11 | protected void onCreate(Bundle savedInstanceState) {
12 | // TODO Auto-generated method stub
13 | super.onCreate(savedInstanceState);
14 |
15 | setContentView(R.layout.table_layout);
16 | }
17 |
18 |
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/assets/context_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/res/layout/context_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/project.properties:
--------------------------------------------------------------------------------
1 | # This file is automatically generated by Android Tools.
2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3 | #
4 | # This file must be checked in Version Control Systems.
5 | #
6 | # To customize properties used by the Ant build system edit
7 | # "ant.properties", and override values to adapt the script to your
8 | # project structure.
9 | #
10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
12 |
13 | # Project target.
14 | target=android-20
15 | android.library=false
16 |
--------------------------------------------------------------------------------
/assets/relative_linear_left.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
17 |
18 |
26 |
27 |
--------------------------------------------------------------------------------
/assets/bundle2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
16 |
17 |
18 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/res/layout/bundle2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
16 |
17 |
18 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/res/layout/relative_linear_left.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
17 |
18 |
26 |
27 |
--------------------------------------------------------------------------------
/assets/date_picker.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
15 |
16 |
20 |
21 |
26 |
27 |
--------------------------------------------------------------------------------
/assets/relative_linear_right.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
17 |
18 |
26 |
27 |
--------------------------------------------------------------------------------
/res/layout/date_picker.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
15 |
16 |
20 |
21 |
26 |
27 |
--------------------------------------------------------------------------------
/res/layout/relative_linear_right.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
17 |
18 |
26 |
27 |
--------------------------------------------------------------------------------
/assets/image_show.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
15 |
16 |
25 |
--------------------------------------------------------------------------------
/res/layout/image_show.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
15 |
16 |
25 |
--------------------------------------------------------------------------------
/assets/tab.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
13 |
14 |
20 |
21 |
27 |
28 |
--------------------------------------------------------------------------------
/res/layout/tab.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
13 |
14 |
20 |
21 |
27 |
28 |
--------------------------------------------------------------------------------
/src/com/cellcom/TabDemoActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.TabActivity;
4 | import android.os.Bundle;
5 | import android.view.LayoutInflater;
6 | import android.widget.TabHost;
7 |
8 | import com.roxstudio.proxycomponent.Proxied;
9 |
10 | //标签控件Tab
11 | public class TabDemoActivity extends Proxied {
12 |
13 |
14 | public void onCreate(Bundle savedInstanceState) {
15 | super.onCreate(savedInstanceState);
16 | setTitle("标签控件Tab");
17 | TabHost tabHost=getTabHost();
18 | LayoutInflater.from(this.asActivity()).inflate(R.layout.tab, tabHost.getTabContentView(),true);
19 | tabHost.addTab(tabHost.newTabSpec("biaoqian1").setIndicator("标签tab1").setContent(R.id.tab1));
20 | tabHost.addTab(tabHost.newTabSpec("biaoqian2").setIndicator("标签tab2").setContent(R.id.tab2));
21 | tabHost.addTab(tabHost.newTabSpec("biaoqian3").setIndicator("标签tab3").setContent(R.id.tab3));
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/assets/table_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
11 |
17 |
22 |
23 |
24 |
25 |
26 |
32 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/res/layout/table_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
11 |
17 |
22 |
23 |
24 |
25 |
26 |
32 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | ProxyDemo
4 |
5 |
6 |
7 |
8 |
9 | com.android.ide.eclipse.adt.ResourceManagerBuilder
10 |
11 |
12 |
13 |
14 | com.android.ide.eclipse.adt.PreCompilerBuilder
15 |
16 |
17 |
18 |
19 | org.eclipse.jdt.core.javabuilder
20 |
21 |
22 |
23 |
24 | com.android.ide.eclipse.adt.ApkBuilder
25 |
26 |
27 |
28 |
29 |
30 | com.android.ide.eclipse.adt.AndroidNature
31 | org.eclipse.jdt.core.javanature
32 |
33 |
34 |
--------------------------------------------------------------------------------
/assets/auto_complete_text_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
18 |
19 |
26 |
27 |
34 |
35 |
--------------------------------------------------------------------------------
/res/layout/auto_complete_text_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
18 |
19 |
26 |
27 |
34 |
35 |
--------------------------------------------------------------------------------
/assets/alert_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
15 |
16 |
21 |
22 |
27 |
28 |
33 |
34 |
--------------------------------------------------------------------------------
/res/layout/alert_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
15 |
16 |
21 |
22 |
27 |
28 |
33 |
34 |
--------------------------------------------------------------------------------
/assets/spinner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
16 |
17 |
23 |
24 |
30 |
31 |
37 |
38 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/res/layout/spinner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
16 |
17 |
23 |
24 |
30 |
31 |
37 |
38 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/src/com/cellcom/RatingBarActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.View;
6 | import android.widget.ImageButton;
7 | import android.widget.RatingBar;
8 | import android.widget.Toast;
9 |
10 | import com.roxstudio.proxycomponent.Proxied;
11 |
12 | //评分组件RatingBar、ImageView图片、 ImageButton图片按钮
13 | public class RatingBarActivity extends Proxied {
14 |
15 | private RatingBar ratingBar;
16 | private ImageButton imageButton;
17 |
18 | @Override
19 | protected void onCreate(Bundle savedInstanceState) {
20 | // TODO Auto-generated method stub
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.rating_bar);
23 | setTitle("评分组件RatingBar、ImageView图片、 ImageButton图片按钮");
24 | ratingBar=(RatingBar)findViewById(R.id.rating_bar);
25 | imageButton=(ImageButton)findViewById(R.id.imageButton);
26 |
27 | imageButton.setOnClickListener(new View.OnClickListener() {
28 |
29 | @Override
30 | public void onClick(View v) {
31 | Toast.makeText(RatingBarActivity.this.asActivity(), "单击图片按钮!!", Toast.LENGTH_LONG).show();
32 | }
33 | });
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/assets/radio_group.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
16 |
17 |
23 |
29 |
30 |
37 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/src/com/cellcom/RadioGroupActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.View;
6 | import android.widget.Button;
7 | import android.widget.RadioButton;
8 |
9 | import com.roxstudio.proxycomponent.Proxied;
10 |
11 | //单选控件
12 | public class RadioGroupActivity extends Proxied {
13 |
14 | private RadioButton radioFemale;
15 | private RadioButton radioMale;
16 | private Button ok;
17 |
18 | @Override
19 | protected void onCreate(Bundle savedInstanceState) {
20 | // TODO Auto-generated method stub
21 | super.onCreate(savedInstanceState);
22 |
23 | setContentView(R.layout.radio_group);
24 |
25 | radioFemale=(RadioButton)findViewById(R.id.radioFemale);
26 | radioMale=(RadioButton)findViewById(R.id.radioMale);
27 | ok=(Button)findViewById(R.id.ok);
28 |
29 | ok.setOnClickListener(new View.OnClickListener() {
30 | @Override
31 | public void onClick(View v) {
32 | String result="你选择的是:";
33 | if(radioFemale.isChecked()){
34 | setTitle(result+"女");
35 | }else{
36 | setTitle(result+"男");
37 | }
38 | }
39 | });
40 | }
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/res/layout/radio_group.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
16 |
17 |
23 |
29 |
30 |
37 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/src/com/cellcom/OptionsMenuActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.Menu;
6 | import android.view.MenuItem;
7 |
8 | import com.roxstudio.proxycomponent.Proxied;
9 |
10 | //OptionsMenu测试
11 | public class OptionsMenuActivity extends Proxied {
12 |
13 | private final static int ITEM0=Menu.FIRST;
14 | private final static int ITEM1=Menu.FIRST+1;
15 |
16 | @Override
17 | protected void onCreate(Bundle savedInstanceState) {
18 | // TODO Auto-generated method stub
19 | super.onCreate(savedInstanceState);
20 | setTitle("单击Menu键看到效果!");
21 | }
22 |
23 | @Override
24 | public boolean onCreateOptionsMenu(Menu menu) {
25 | //第一个参数:组ID 第二个参数:菜单项ID 第三个参数:顺序号 第四个参数:菜单项上显示的内容
26 | menu.add(0,ITEM0,0,"开始");
27 | menu.add(0,ITEM1,0,"结束");
28 | return true;
29 | }
30 |
31 | @Override
32 | public boolean onOptionsItemSelected(MenuItem item) {
33 | switch (item.getItemId()) {
34 | case ITEM0:
35 | setTitle("开始游戏");
36 | break;
37 | case ITEM1:
38 | setTitle("结束游戏");
39 | break;
40 | default:
41 | break;
42 | }
43 | return true;
44 | }
45 |
46 | }
47 |
--------------------------------------------------------------------------------
/assets/tab_widget.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
19 |
23 |
28 |
33 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/res/layout/tab_widget.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
19 |
23 |
28 |
33 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/assets/check_box.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
16 |
17 |
23 |
24 |
30 |
31 |
37 |
38 |
43 |
48 |
49 |
--------------------------------------------------------------------------------
/res/layout/check_box.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
16 |
17 |
23 |
24 |
30 |
31 |
37 |
38 |
43 |
48 |
49 |
--------------------------------------------------------------------------------
/assets/relative_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
17 |
18 |
21 |
28 |
29 |
32 |
41 |
42 |
45 |
53 |
54 |
--------------------------------------------------------------------------------
/res/layout/relative_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
17 |
18 |
21 |
28 |
29 |
32 |
41 |
42 |
45 |
53 |
54 |
--------------------------------------------------------------------------------
/assets/rating_bar.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
11 |
12 |
16 |
17 |
22 |
23 |
27 |
28 |
33 |
34 |
38 |
39 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/res/layout/rating_bar.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
11 |
12 |
16 |
17 |
22 |
23 |
27 |
28 |
33 |
34 |
38 |
39 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/src/com/cellcom/RelativeAndLinearActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.os.Bundle;
6 | import android.view.LayoutInflater;
7 | import android.widget.LinearLayout;
8 | import android.widget.RelativeLayout;
9 |
10 | import com.roxstudio.proxycomponent.Proxied;
11 |
12 | public class RelativeAndLinearActivity extends Proxied {
13 |
14 | @Override
15 | protected void onCreate(Bundle savedInstanceState) {
16 | // TODO Auto-generated method stub
17 | super.onCreate(savedInstanceState);
18 |
19 | //创建线性布局LinearLayout对象
20 | LinearLayout layoutMain=new LinearLayout(this.asActivity());
21 | //设置水平方向
22 | layoutMain.setOrientation(LinearLayout.HORIZONTAL);
23 | setContentView(layoutMain);
24 |
25 | /**
26 | * LayoutInflater的作用类似于 findViewById(),不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化!而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。
27 | */
28 | LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
29 | RelativeLayout layoutLeft=(RelativeLayout)inflater.inflate(R.layout.relative_linear_left, null);
30 | RelativeLayout layoutRight=(RelativeLayout)inflater.inflate(R.layout.relative_linear_right, null);
31 |
32 | RelativeLayout.LayoutParams layoutParams=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
33 | layoutMain.addView(layoutLeft, 100, 100);
34 | layoutMain.addView(layoutRight,layoutParams);
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/assets/alert_dialog_text_entry.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
18 |
19 |
28 |
29 |
37 |
38 |
47 |
48 |
--------------------------------------------------------------------------------
/assets/notification.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
14 |
15 |
20 |
21 |
26 |
27 |
28 |
32 |
33 |
38 |
39 |
44 |
45 |
50 |
51 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/res/layout/alert_dialog_text_entry.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
18 |
19 |
28 |
29 |
37 |
38 |
47 |
48 |
--------------------------------------------------------------------------------
/src/com/cellcom/AutoCompleteTextViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.View;
6 | import android.widget.ArrayAdapter;
7 | import android.widget.AutoCompleteTextView;
8 | import android.widget.Button;
9 |
10 | import com.roxstudio.proxycomponent.Proxied;
11 |
12 | //自动提示框
13 | public class AutoCompleteTextViewActivity extends Proxied {
14 |
15 | private AutoCompleteTextView autoComplete;
16 | private Button cleanButton;
17 | static final String[] COUNTRIES = new String[] {
18 | "China" ,"Russia", "Germany",
19 | "Ukraine", "Belarus", "USA" ,"China1" ,"China12", "Germany",
20 | "Russia2", "Belarus", "USA" ,"UAA","UBC","UBB","CCC","BBB","广州1","广州2","广州3","广州4","广东1","广东2","广东3",
21 | };
22 |
23 | @Override
24 | protected void onCreate(Bundle savedInstanceState) {
25 | // TODO Auto-generated method stub
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.auto_complete_text_view);
28 | setTitle("AutoCompleteTextView示例!");
29 | autoComplete=(AutoCompleteTextView)findViewById(R.id.auto_complete);
30 | cleanButton=(Button)findViewById(R.id.cleanButton);
31 |
32 | ArrayAdapter adapter=new ArrayAdapter(AutoCompleteTextViewActivity.this.asActivity(),android.R.layout.simple_dropdown_item_1line,COUNTRIES);
33 | autoComplete.setAdapter(adapter);
34 |
35 | //清空
36 | cleanButton.setOnClickListener(new View.OnClickListener() {
37 | @Override
38 | public void onClick(View v) {
39 | autoComplete.setText("");
40 | }
41 | });
42 | }
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/res/layout/notification.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
14 |
15 |
20 |
21 |
26 |
27 |
28 |
32 |
33 |
38 |
39 |
44 |
45 |
50 |
51 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/com/cellcom/CheckBoxActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.View;
6 | import android.widget.Button;
7 | import android.widget.CheckBox;
8 |
9 | import com.roxstudio.proxycomponent.Proxied;
10 |
11 | public class CheckBoxActivity extends Proxied {
12 |
13 | private CheckBox plainCB;
14 | private CheckBox serifCB;
15 | private CheckBox boldCB;
16 | private CheckBox italicCB;
17 | private Button button1;
18 | @Override
19 | protected void onCreate(Bundle savedInstanceState) {
20 | // TODO Auto-generated method stub
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.check_box);
23 |
24 | plainCB=(CheckBox)findViewById(R.id.plain_cb);
25 | serifCB=(CheckBox)findViewById(R.id.serif_cb);
26 | boldCB=(CheckBox)findViewById(R.id.bold_cb);
27 | italicCB=(CheckBox)findViewById(R.id.italic_cb);
28 | button1=(Button)findViewById(R.id.button1);
29 |
30 | button1.setOnClickListener(new View.OnClickListener() {
31 | @Override
32 | public void onClick(View v) {
33 | String result="";
34 | if(plainCB.isChecked()){
35 | result+=plainCB.getText()+"、";
36 | }
37 | if(serifCB.isChecked()){
38 | result+=serifCB.getText()+"、";
39 | }
40 | if(boldCB.isChecked()){
41 | result+=boldCB.getText()+"、";
42 | }
43 | if(italicCB.isChecked()){
44 | result+=italicCB.getText()+"、";
45 | }
46 | if(!"".equals(result)){
47 | result=result.substring(0,result.length()-1);
48 | }else{
49 | result="你没有选择!!!";
50 | }
51 | setTitle("Checked:"+result);
52 | }
53 | });
54 |
55 | }
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/src/com/cellcom/ContextMenuActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.graphics.Color;
5 | import android.os.Bundle;
6 | import android.view.ContextMenu;
7 | import android.view.ContextMenu.ContextMenuInfo;
8 | import android.view.Menu;
9 | import android.view.MenuItem;
10 | import android.view.View;
11 | import android.widget.TextView;
12 |
13 | import com.roxstudio.proxycomponent.Proxied;
14 |
15 | public class ContextMenuActivity extends Proxied {
16 |
17 | private final static int ITEM0=Menu.FIRST;
18 | private final static int ITEM1=Menu.FIRST+1;
19 | private final static int ITEM2=Menu.FIRST+2;
20 | private TextView tv;
21 |
22 | @Override
23 | protected void onCreate(Bundle savedInstanceState) {
24 | // TODO Auto-generated method stub
25 | super.onCreate(savedInstanceState);
26 | setContentView(R.layout.context_menu);
27 | setTitle("单击Menu键看到效果!");
28 | tv=(TextView)findViewById(R.id.tv1);
29 |
30 | this.registerForContextMenu(tv);//将上下文注册到TextView
31 | }
32 |
33 | @Override
34 | public void onCreateContextMenu(ContextMenu menu, View v,
35 | ContextMenuInfo menuInfo) {
36 | menu.add(0, ITEM0, 0, "红色背景");
37 | menu.add(0,ITEM1,0,"绿色背景");
38 | menu.add(0,ITEM2,0,"白色背景");
39 |
40 | }
41 |
42 | @Override
43 | public boolean onContextItemSelected(MenuItem item) {
44 | switch (item.getItemId()) {
45 | case ITEM0:
46 | tv.setTextColor(Color.RED);
47 | break;
48 | case ITEM1:
49 | tv.setTextColor(Color.GREEN);
50 | break;
51 | case ITEM2:
52 | tv.setTextColor(Color.WHITE);
53 | break;
54 | default:
55 | break;
56 | }
57 | return true;
58 | }
59 |
60 | }
61 |
--------------------------------------------------------------------------------
/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 基本布局、组件!!!
4 | 基础组件测试
5 |
6 | FrameLayout
7 | RelativeLayout
8 | RelativeAndLinear
9 | TableLayout
10 | 选项卡TabWidget
11 | CheckBox多选框
12 | RadioGroup单选框
13 | Spinner下拉框
14 | AutoCompleteTextView
15 | Date、TimePicker
16 | ProgressBar进度条
17 | RatingBar投票
18 | ImageSwitcher、Gallery
19 | GridView网络视图
20 | Tab标签
21 | OptionsMenu
22 | ContextMenu
23 | SubMenu
24 | Activity值传递
25 | 4种AlertDialog
26 | 有两个button的对话框1
27 | 有三个button的对话框2
28 | 能进行输入的对话框
29 | 进度框
30 | Notification
31 |
32 | 第一个按钮
33 | 第二个按钮
34 |
35 | 确定
36 | 开始
37 | 暂停
38 |
39 | #770000ff
40 | #77ffff00
41 | #00FF99
42 |
43 |
--------------------------------------------------------------------------------
/src/com/cellcom/Bundle2Activity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import java.text.DecimalFormat;
4 | import java.text.NumberFormat;
5 |
6 | import android.app.Activity;
7 | import android.content.Intent;
8 | import android.os.Bundle;
9 | import android.view.View;
10 | import android.widget.Button;
11 | import android.widget.TextView;
12 |
13 | import com.roxstudio.proxycomponent.Proxied;
14 |
15 | public class Bundle2Activity extends Proxied {
16 |
17 | private TextView result;
18 | private Button backButton;
19 | Intent intent=null;
20 | @Override
21 | protected void onCreate(Bundle savedInstanceState) {
22 | // TODO Auto-generated method stub
23 | super.onCreate(savedInstanceState);
24 | setContentView(R.layout.bundle2);
25 | result=(TextView)findViewById(R.id.result);
26 | backButton=(Button)findViewById(R.id.button_back);
27 |
28 | intent=this.getIntent();
29 | Bundle bundle=intent.getExtras();
30 | double height=bundle.getDouble("height");
31 | String sex=bundle.getString("sex");
32 | String sexStr="";
33 | if("M".equals(sex)){
34 | sexStr="男性";
35 | }else{
36 | sexStr="女性";
37 | }
38 | String weight=this.getWeight(sex, height);
39 | result.setText("你是一位:"+sexStr+"\n身高是:"+height+"厘米 \n你的标准体重:"+weight+"公斤");
40 |
41 | //返回上一页
42 | backButton.setOnClickListener(new View.OnClickListener() {
43 | @Override
44 | public void onClick(View v) {
45 | Bundle2Activity.this.setResult(Activity.RESULT_OK, intent);
46 | Bundle2Activity.this.finish();
47 | }
48 | });
49 | }
50 |
51 | public String getWeight(String sex,double height){
52 | String weight="";
53 | if("M".endsWith(sex)){
54 | weight=format((height-80)*0.7);
55 | }else{
56 | weight=format((height-70)*0.6);
57 | }
58 | return weight;
59 | }
60 |
61 | public String format(double num){
62 | NumberFormat formatter=new DecimalFormat("0.00");
63 | String s=formatter.format(num);
64 | return s;
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/src/com/cellcom/SubMenuActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.Menu;
6 | import android.view.MenuItem;
7 | import android.view.SubMenu;
8 |
9 | import com.roxstudio.proxycomponent.Proxied;
10 |
11 | //子菜单subMenu
12 | public class SubMenuActivity extends Proxied {
13 |
14 | private final static int ITEM_NEW_FILE=Menu.FIRST;
15 | private final static int ITEM_OPEN_FILE=Menu.FIRST+1;
16 | private final static int ITEM_COPY=Menu.FIRST+2;
17 | private final static int ITEM_CLOSE=Menu.FIRST+3;
18 | private final static int ITEM_SAVE=Menu.FIRST+4;
19 | private final static int ITEM_SAVE_ALL=Menu.FIRST+5;
20 | private final static int ITEM_CUT=Menu.FIRST+6;
21 | private final static int ITEM_PASTE=Menu.FIRST+7;
22 |
23 | @Override
24 | protected void onCreate(Bundle savedInstanceState) {
25 | // TODO Auto-generated method stub
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.sub_menu);
28 | setTitle("单击Menu键看到效果!");
29 | }
30 |
31 | @Override
32 | public boolean onCreateOptionsMenu(Menu menu) {
33 | SubMenu file=menu.addSubMenu("文件");
34 | SubMenu edit=menu.addSubMenu("编辑");
35 |
36 | file.add(0,ITEM_NEW_FILE,0,"新建");
37 | file.add(0,ITEM_OPEN_FILE,0,"打开");
38 | file.add(0,ITEM_CLOSE,0,"关闭");
39 | file.add(0,ITEM_SAVE,0,"保存");
40 | file.add(0,ITEM_SAVE_ALL,0,"保存全部");
41 |
42 |
43 | edit.add(0,ITEM_COPY,0,"复制");
44 | edit.add(0,ITEM_CUT,0,"剪切");
45 | edit.add(0,ITEM_PASTE,0,"粘贴");
46 |
47 | return true;
48 | }
49 |
50 | @Override
51 | public boolean onOptionsItemSelected(MenuItem item) {
52 | switch (item.getItemId()) {
53 | case ITEM_NEW_FILE:
54 | setTitle("新建文件!");
55 | break;
56 | case ITEM_OPEN_FILE:
57 | setTitle("打开文件");
58 | break;
59 | case ITEM_COPY:
60 | setTitle("复制文件");
61 | break;
62 | default:
63 | break;
64 | }
65 | return true;
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/src/com/cellcom/DatePickerActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import java.text.SimpleDateFormat;
4 | import java.util.Date;
5 |
6 | import android.app.Activity;
7 | import android.os.Bundle;
8 | import android.view.View;
9 | import android.widget.Button;
10 | import android.widget.DatePicker;
11 | import android.widget.TimePicker;
12 |
13 | import com.roxstudio.proxycomponent.Proxied;
14 |
15 | //DatePicker日期选择器、TimePicker时间选择器 使用
16 | public class DatePickerActivity extends Proxied {
17 |
18 | private Button datePickerButton;
19 | private DatePicker datePicker1;
20 | private TimePicker timePicker1;
21 |
22 | //默认生成系统当前时间
23 | SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");
24 | String str=sdf.format(new Date());
25 | int year=Integer.parseInt(str.substring(0, 4));
26 | int month=Integer.parseInt(str.substring(5,7))-1;
27 | int day=Integer.parseInt(str.substring(8,10));
28 | int hour=Integer.parseInt(str.substring(11,13));
29 | int minute=Integer.parseInt(str.substring(14,16));
30 |
31 | @Override
32 | protected void onCreate(Bundle savedInstanceState) {
33 | // TODO Auto-generated method stub
34 | super.onCreate(savedInstanceState);
35 | setContentView(R.layout.date_picker);
36 | setTitle("DatePicker、TimePicker示例!");
37 |
38 | datePicker1=(DatePicker)findViewById(R.id.datePicker1);
39 | timePicker1=(TimePicker)findViewById(R.id.timePicker1);
40 | datePickerButton=(Button)findViewById(R.id.datePickerButton1);
41 |
42 | datePicker1.init(year,month,day, null);
43 |
44 | timePicker1.setCurrentHour(hour);
45 | timePicker1.setCurrentMinute(minute);
46 |
47 | timePicker1.setIs24HourView(true);
48 |
49 | datePickerButton.setOnClickListener(new View.OnClickListener() {
50 | @Override
51 | public void onClick(View v) {
52 | setTitle("你选择的是:"+datePicker1.getYear()+"年"+datePicker1.getMonth()+"月"+datePicker1.getDayOfMonth()+"日 "+timePicker1.getCurrentHour()+"小时"+timePicker1.getCurrentMinute()+"分");
53 | }
54 | });
55 | }
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/assets/bundle1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
16 |
17 |
24 |
25 |
32 |
33 |
40 |
46 |
51 |
52 |
53 |
61 |
62 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/res/layout/bundle1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
16 |
17 |
24 |
25 |
32 |
33 |
40 |
46 |
51 |
52 |
53 |
61 |
62 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/assets/progress_bar.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
19 |
25 |
26 |
27 |
31 |
32 |
46 |
47 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/res/layout/progress_bar.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
19 |
25 |
26 |
27 |
31 |
32 |
46 |
47 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/src/com/cellcom/GridViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.BaseAdapter;
9 | import android.widget.GridView;
10 | import android.widget.ImageView;
11 |
12 | import com.roxstudio.proxycomponent.Proxied;
13 |
14 | //网络视图控件
15 | public class GridViewActivity extends Proxied {
16 |
17 | @Override
18 | protected void onCreate(Bundle savedInstanceState) {
19 | // TODO Auto-generated method stub
20 | super.onCreate(savedInstanceState);
21 | setContentView(R.layout.grid_view);
22 | setTitle("网络视图控件GridView!");
23 |
24 | GridView gridView=(GridView)findViewById(R.id.grid_view);
25 | gridView.setAdapter(new ImageAdapter(this.asActivity()));
26 |
27 | }
28 |
29 | public class ImageAdapter extends BaseAdapter{
30 |
31 | private Context mContext;
32 | public ImageAdapter(Context context){
33 | mContext=context;
34 | }
35 | @Override
36 | public int getCount() {
37 | // TODO Auto-generated method stub
38 | return mImageIds.length;
39 | }
40 |
41 | @Override
42 | public Object getItem(int position) {
43 | // TODO Auto-generated method stub
44 | return null;
45 | }
46 |
47 | @Override
48 | public long getItemId(int position) {
49 | // TODO Auto-generated method stub
50 | return 0;
51 | }
52 |
53 | @Override
54 | public View getView(int position, View convertView, ViewGroup parent) {
55 | ImageView imageView;
56 | if(convertView==null){
57 | imageView=new ImageView(mContext);
58 | imageView.setLayoutParams(new GridView.LayoutParams(85,85));
59 | imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
60 | imageView.setPadding(8, 8, 8, 8);
61 | }else{
62 | imageView=(ImageView)convertView;
63 | }
64 | imageView.setImageResource(mImageIds[position]);
65 | return imageView;
66 | }
67 |
68 | }
69 |
70 |
71 |
72 | private Integer[] mImageIds = {
73 | R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2,
74 | R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5,
75 | R.drawable.sample_6, R.drawable.sample_7,R.drawable.sample_8,
76 | R.drawable.sample_9,R.drawable.sample_10,R.drawable.sample_11};
77 |
78 | }
79 |
--------------------------------------------------------------------------------
/src/com/cellcom/Bundle1Activity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.widget.Button;
8 | import android.widget.EditText;
9 | import android.widget.RadioButton;
10 |
11 | import com.roxstudio.proxycomponent.Proxied;
12 |
13 | /**
14 | * @author nwang
15 | *
16 | * 输入身高和选择性别,计算标准体重。并把数据返回到原来Activity
17 | */
18 | public class Bundle1Activity extends Proxied {
19 |
20 | private int my_requestCode=1550;
21 | private RadioButton sexMan;
22 | private RadioButton sexWoman;
23 | private EditText heightEdit;
24 | private Button okButton;
25 |
26 | @Override
27 | protected void onCreate(Bundle savedInstanceState) {
28 |
29 | super.onCreate(savedInstanceState);
30 | setContentView(R.layout.bundle1);
31 |
32 | sexMan=(RadioButton)findViewById(R.id.sex_man);
33 | sexWoman=(RadioButton)findViewById(R.id.sex_woman);
34 | heightEdit=(EditText)findViewById(R.id.height_edit);
35 | okButton=(Button)findViewById(R.id.button_ok);
36 |
37 | okButton.setOnClickListener(new View.OnClickListener() {
38 | @Override
39 | public void onClick(View v) {
40 | double height=Double.parseDouble(heightEdit.getText().toString());
41 | String sex="";
42 | if(sexMan.isChecked()){
43 | sex="M";
44 | }else{
45 | sex="F";
46 | }
47 |
48 | Intent intent=new Intent();
49 | intent.setClass(Bundle1Activity.this.asActivity(), Bundle2Activity.class);
50 | //封装数据
51 | Bundle bundle=new Bundle();
52 | bundle.putDouble("height", height);
53 | bundle.putString("sex", sex);
54 | intent.putExtras(bundle);
55 | startActivityForResult(intent, my_requestCode);
56 | }
57 | });
58 | }
59 |
60 | //回调方法
61 | @Override
62 | protected void onActivityResult(int requestCode, int resultCode, Intent data) {
63 | super.onActivityResult(requestCode, resultCode, data);
64 |
65 | switch (requestCode) {
66 | case Activity.RESULT_OK:
67 | //RESULT_OK表示返回成功,提取数据。
68 | Bundle bundle=data.getExtras();
69 | String sex=bundle.getString("sex");
70 | double height=bundle.getDouble("height");
71 | heightEdit.setText(String.valueOf(height));
72 | if(sex.equals("M")){
73 | sexMan.setChecked(true);
74 | }else{
75 | sexWoman.setChecked(true);
76 | }
77 | break;
78 |
79 | default:
80 | break;
81 | }
82 | }
83 |
84 | }
85 |
--------------------------------------------------------------------------------
/src/com/cellcom/ProgressBarHandlerActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 | import android.app.Activity;
3 | import android.os.Bundle;
4 | import android.os.Handler;
5 | import android.view.View;
6 | import android.widget.Button;
7 | import android.widget.ProgressBar;
8 | import android.widget.TextView;
9 |
10 | import com.roxstudio.proxycomponent.Proxied;
11 |
12 | /**
13 | *
14 | * @author nwang
15 | *
16 | * 进度条ProgressBar与线程使用。单击开始按钮,进度条水平方向前进!
17 | *
18 | */
19 | public class ProgressBarHandlerActivity extends Proxied {
20 | /** Called when the activity is first created. */
21 |
22 | private Button startButton;
23 | private Button stopButton;
24 | private TextView result;
25 | private ProgressBar firstProgressBar;
26 | private final static int defaultValue=10;
27 | private int i=0;
28 |
29 |
30 | @Override
31 | public void onCreate(Bundle savedInstanceState) {
32 | super.onCreate(savedInstanceState);
33 | setContentView(R.layout.progress_bar);
34 | setTitle("ProgressBar使用!");
35 | startButton=(Button)findViewById(R.id.startButton);
36 | stopButton=(Button)findViewById(R.id.stopButton);
37 | result=(TextView)findViewById(R.id.result);
38 | firstProgressBar=(ProgressBar)findViewById(R.id.firstProgressBar);
39 |
40 | firstProgressBar.setVisibility(0);//刚开始设置进度条可见
41 |
42 | startButton.setOnClickListener(new View.OnClickListener() {
43 |
44 | @Override
45 | public void onClick(View v) {
46 | /*i+=defaultValue;
47 | firstProgressBar.setProgress(i);
48 | firstProgressBar.setSecondaryProgress(i+defaultValue);*/
49 | result.setText(((double)i/firstProgressBar.getMax()*100)+"%");
50 | handler.post(progressBarThread);
51 | }
52 | });
53 |
54 | stopButton.setOnClickListener(new View.OnClickListener() {
55 |
56 | @Override
57 | public void onClick(View v) {
58 | handler.removeCallbacks(progressBarThread);
59 | }
60 | });
61 | }
62 |
63 | //创建Handler对象
64 | Handler handler=new Handler();
65 |
66 | //创建线程对象
67 | MyRunnable progressBarThread=new MyRunnable();
68 | class MyRunnable implements Runnable{
69 | @Override
70 | public void run() {
71 | i+=defaultValue;
72 | handler.postDelayed(progressBarThread, 1000);
73 | firstProgressBar.setProgress(i);
74 | firstProgressBar.setSecondaryProgress(i+defaultValue);
75 | result.setText(((double)i/firstProgressBar.getMax()*100)+"%");
76 | if(i>=firstProgressBar.getMax()) i=0;
77 |
78 | }
79 |
80 | }
81 |
82 | }
--------------------------------------------------------------------------------
/src/com/cellcom/TabWidgetActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.AlertDialog;
4 | import android.app.Dialog;
5 | import android.app.TabActivity;
6 | import android.content.DialogInterface;
7 | import android.graphics.Color;
8 | import android.os.Bundle;
9 | import android.widget.TabHost;
10 | import android.widget.TabHost.OnTabChangeListener;
11 | import android.widget.Toast;
12 |
13 | import com.roxstudio.proxycomponent.Proxied;
14 |
15 | //注意这个activity继承的是TabActivity
16 | public class TabWidgetActivity extends Proxied {
17 |
18 | //声明TabHost对象
19 | private TabHost mTabHost;
20 |
21 | @Override
22 | protected void onCreate(Bundle savedInstanceState) {
23 | // TODO Auto-generated method stub
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.tab_widget);
26 |
27 | //获取TabHoast对象
28 | mTabHost=getTabHost();
29 | /* 为TabHost添加标签 */
30 | //新建一个newTabSpec(newTabSpec)
31 | //设置其标签和图标(setIndicator)
32 | //设置内容(setContent)
33 | mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB1",getResources().getDrawable(R.drawable.img1)).setContent(R.id.textview1));
34 | mTabHost.addTab(mTabHost.newTabSpec("tab_test2").setIndicator("TAB2",getResources().getDrawable(R.drawable.img2)).setContent(R.id.textview2));
35 | mTabHost.addTab(mTabHost.newTabSpec("tab_test3").setIndicator("TAB3",getResources().getDrawable(R.drawable.img3)).setContent(R.id.textview3));
36 |
37 | //设置TabHost的背景颜色
38 | mTabHost.setBackgroundColor(Color.argb(150, 22, 70, 150));
39 |
40 | //显示第一个tab
41 | mTabHost.setCurrentTab(0);
42 |
43 | //标签切换事件处理,setOnTabChangedListener
44 | mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
45 | @Override
46 | public void onTabChanged(String tabId) {
47 | // TODO Auto-generated method stub
48 | Dialog dialog=new AlertDialog.Builder(TabWidgetActivity.this.asActivity())
49 | .setTitle("提醒你")
50 | .setMessage("你当前选中的是"+tabId+"标签!")
51 | .setPositiveButton("确定", new DialogInterface.OnClickListener() {
52 | @Override
53 | public void onClick(DialogInterface dialog, int which) {
54 | Toast.makeText(TabWidgetActivity.this.asActivity(), "你单击了确定按钮!", Toast.LENGTH_LONG).show();
55 | dialog.cancel();
56 | }
57 | })
58 | .setNegativeButton("取消", new DialogInterface.OnClickListener() {
59 |
60 | @Override
61 | public void onClick(DialogInterface dialog, int which) {
62 | Toast.makeText(TabWidgetActivity.this.asActivity(), "你单击了取消按钮!", Toast.LENGTH_LONG).show();
63 | dialog.cancel();
64 | }
65 | })
66 | .create();
67 | dialog.show();
68 | }
69 | });
70 | }
71 |
72 | }
73 |
--------------------------------------------------------------------------------
/src/com/cellcom/SpinnerActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | import android.app.Activity;
7 | import android.os.Bundle;
8 | import android.view.View;
9 | import android.widget.AdapterView;
10 | import android.widget.ArrayAdapter;
11 | import android.widget.Button;
12 | import android.widget.Spinner;
13 |
14 | import com.roxstudio.proxycomponent.Proxied;
15 |
16 | //下拉框
17 | public class SpinnerActivity extends Proxied {
18 |
19 | private Spinner spinner1;
20 | private Spinner spinner2;
21 | private Button ok;
22 | private ArrayAdapter countiesAdapter;
23 | private String[] mCounties={"beijing","guangdong","guangxi","hunan"};
24 | private List allCounties=new ArrayList();
25 | private String result="你选择的是:";
26 |
27 |
28 | @Override
29 | protected void onCreate(Bundle savedInstanceState) {
30 | // TODO Auto-generated method stub
31 | super.onCreate(savedInstanceState);
32 | setContentView(R.layout.spinner);
33 |
34 | spinner1=(Spinner)findViewById(R.id.spinner1);
35 | spinner2=(Spinner)findViewById(R.id.spinner2);
36 | ok=(Button)findViewById(R.id.ok);
37 |
38 | for(int i=0;i(SpinnerActivity.this.asActivity(),android.R.layout.simple_spinner_item,allCounties);
43 | countiesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
44 | spinner1.setAdapter(countiesAdapter);
45 |
46 | ArrayAdapter adapter=ArrayAdapter.createFromResource(SpinnerActivity.this.asActivity(),R.array.counties,android.R.layout.simple_spinner_item);
47 | adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
48 | spinner2.setAdapter(adapter);
49 |
50 | //单击第一个下拉按钮时,显示选择的值。
51 | spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
52 | @Override
53 | public void onItemSelected(AdapterView> adapter, View view,
54 | int position, long id) {
55 | // TODO Auto-generated method stub
56 | String str=(String)spinner1.getAdapter().getItem((int)id);
57 | setTitle(result+str);
58 | }
59 |
60 | @Override
61 | public void onNothingSelected(AdapterView> arg0) {
62 | // TODO Auto-generated method stub
63 |
64 | }
65 | });
66 |
67 | //单击第二个下拉按钮时,显示选择的值。
68 | spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
69 | @Override
70 | public void onItemSelected(AdapterView> adapter, View view,
71 | int position, long id) {
72 | String str=(String)spinner2.getAdapter().getItem(position);
73 | setTitle(result+str);
74 | }
75 |
76 | @Override
77 | public void onNothingSelected(AdapterView> arg0) {
78 | }
79 | });
80 |
81 |
82 |
83 | //单击确定按钮,提取选择的值.
84 | ok.setOnClickListener(new View.OnClickListener() {
85 | @Override
86 | public void onClick(View v) {
87 | setTitle(result+spinner1.getSelectedItem()+" - >> "+spinner2.getSelectedItem());
88 | }
89 | });
90 |
91 | }
92 |
93 | }
94 |
--------------------------------------------------------------------------------
/src/com/cellcom/ImageShowActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.view.animation.AnimationUtils;
9 | import android.widget.AdapterView;
10 | import android.widget.BaseAdapter;
11 | import android.widget.Gallery;
12 | import android.widget.Gallery.LayoutParams;
13 | import android.widget.ImageSwitcher;
14 | import android.widget.ImageView;
15 | import android.widget.ViewSwitcher;
16 |
17 | import com.roxstudio.proxycomponent.Proxied;
18 |
19 |
20 | //显示画像效果
21 | public class ImageShowActivity extends Proxied implements ViewSwitcher.ViewFactory{
22 |
23 | private ImageSwitcher mSwitcher;
24 | private Gallery gallery;
25 | private Context mContext;
26 |
27 | private Integer[] mImageIds = {
28 | R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2,
29 | R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5,
30 | R.drawable.sample_6, R.drawable.sample_7,R.drawable.sample_8,
31 | R.drawable.sample_9,R.drawable.sample_10,R.drawable.sample_11};
32 |
33 | @Override
34 | protected void onCreate(Bundle savedInstanceState) {
35 | // TODO Auto-generated method stub
36 | super.onCreate(savedInstanceState);
37 | setContentView(R.layout.image_show);
38 | setTitle("浏览图片");
39 | mSwitcher=(ImageSwitcher)findViewById(R.id.switcher);
40 | gallery=(Gallery)findViewById(R.id.gallery);
41 |
42 | mSwitcher.setFactory(this);
43 | mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this.asActivity(), android.R.anim.fade_in));
44 | mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this.asActivity(), android.R.anim.fade_out));
45 |
46 | gallery.setAdapter(new ImageAdapter(this.asActivity()));
47 | gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
48 |
49 | @Override
50 | public void onItemSelected(AdapterView> adapter, View view,
51 | int position, long id) {
52 | mSwitcher.setImageResource(mImageIds[position]);
53 | }
54 |
55 | @Override
56 | public void onNothingSelected(AdapterView> arg0) {
57 |
58 | }
59 |
60 | });
61 | }
62 |
63 | public class ImageAdapter extends BaseAdapter{
64 |
65 | public ImageAdapter(Context context){
66 | mContext=context;
67 | }
68 |
69 | @Override
70 | public int getCount() {
71 | return mImageIds.length;
72 | }
73 |
74 | @Override
75 | public Object getItem(int position) {
76 |
77 | return position;
78 | }
79 |
80 | @Override
81 | public long getItemId(int position) {
82 |
83 | return position;
84 | }
85 |
86 | @Override
87 | public View getView(int position, View convertView, ViewGroup parent) {
88 | ImageView i=new ImageView(mContext);
89 | i.setImageResource(mImageIds[position]);
90 | i.setAdjustViewBounds(true);
91 | i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
92 | i.setBackgroundResource(R.drawable.picture_frame);
93 | return i;
94 | }
95 |
96 | }
97 |
98 | @Override
99 | public View makeView() {
100 | ImageView i=new ImageView(this.asActivity());
101 | i.setBackgroundColor(0xFF000000);
102 | i.setScaleType(ImageView.ScaleType.FIT_CENTER);
103 | i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
104 | return i;
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/src/com/cellcom/NotificationActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.app.Notification;
5 | import android.app.NotificationManager;
6 | import android.app.PendingIntent;
7 | import android.content.Context;
8 | import android.content.Intent;
9 | import android.net.Uri;
10 | import android.os.Bundle;
11 | import android.view.View;
12 | import android.view.View.OnClickListener;
13 | import android.widget.Button;
14 |
15 | import com.roxstudio.proxycomponent.Proxied;
16 |
17 | //在状态栏中提示
18 | public class NotificationActivity extends Proxied {
19 |
20 | private Button sumButton;
21 | private Button cloudyButton;
22 | private Button rainButton;
23 | private Button defaultSound;
24 | private NotificationManager notificationManager;
25 |
26 | @Override
27 | protected void onCreate(Bundle savedInstanceState) {
28 | super.onCreate(savedInstanceState);
29 | setContentView(R.layout.notification);
30 | setTitle("天气预报!");
31 | sumButton=(Button)findViewById(R.id.sum_1);
32 | cloudyButton=(Button)findViewById(R.id.cloudy_1);
33 | rainButton=(Button)findViewById(R.id.rain_1);
34 | defaultSound=(Button)findViewById(R.id.defaultSound);
35 |
36 | sumButton.setOnClickListener(new SumButtonListener());
37 | cloudyButton.setOnClickListener(new CloudyButtonListener());
38 | rainButton.setOnClickListener(new RainButtonListener());
39 | defaultSound.setOnClickListener(new DefaultSoundListener());
40 | notificationManager=(NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
41 | }
42 |
43 | class SumButtonListener implements OnClickListener{
44 | @Override
45 | public void onClick(View v) {
46 | setWeather("晴","天气","好2",R.drawable.sun);
47 | }
48 | }
49 |
50 | class CloudyButtonListener implements OnClickListener{
51 | @Override
52 | public void onClick(View v) {
53 | setWeather("阴","天气","一般2",R.drawable.cloudy);
54 | }
55 | }
56 |
57 | class RainButtonListener implements OnClickListener{
58 | @Override
59 | public void onClick(View v) {
60 | setWeather("下雨","天气","不好2",R.drawable.rain);
61 | }
62 | }
63 |
64 | class DefaultSoundListener implements OnClickListener{
65 | @Override
66 | public void onClick(View v) {
67 | //播放a.mp3文件
68 | /*MediaPlayer mediaPlayer;
69 | mediaPlayer = MediaPlayer.create(NotificationActivity.this, R.drawable.a);
70 | mediaPlayer.setLooping(true);
71 | mediaPlayer.start();*/
72 | //setDefault(Notification.DEFAULT_SOUND);
73 |
74 | setSound();
75 | }
76 |
77 | }
78 |
79 | private void setWeather(String tickerText,String title,String content,int drawable){
80 | Notification notification=new Notification(drawable, tickerText, System.currentTimeMillis());
81 | Intent intent=new Intent();
82 | intent.setClass(this.asActivity(), MainActivity.class);
83 | PendingIntent pendingIntent=PendingIntent.getActivity(this.asActivity(), 0, intent, 0);
84 | notification.setLatestEventInfo(this.asActivity(), title, content, pendingIntent);
85 | notificationManager.notify(R.layout.notification, notification);
86 | }
87 |
88 | private void setDefault(int defaults){
89 | Intent intent=new Intent();
90 | intent.setClass(this.asActivity(), MainActivity.class);
91 | PendingIntent pendingIntent=PendingIntent.getActivity(this.asActivity(), 0, intent, 0);
92 | String title="默认: 天气预报";
93 | String content="晴";
94 | Notification notification=new Notification(R.drawable.sun,content,System.currentTimeMillis());
95 | notification.setLatestEventInfo(this.asActivity(), title, content, pendingIntent);
96 | notification.defaults=defaults;
97 | notificationManager.notify(R.layout.notification, notification);
98 | }
99 |
100 | private void setSound(){
101 | Intent intent=new Intent();
102 | intent.setClass(this.asActivity(), MainActivity.class);
103 | PendingIntent pendingIntent=PendingIntent.getActivity(this.asActivity(), 0, intent, 0);
104 | String title="默认: 声音测试";
105 | String content="晴";
106 | Notification notification=new Notification(R.drawable.sun,content,System.currentTimeMillis());
107 | notification.setLatestEventInfo(this.asActivity(), title, content, pendingIntent);
108 | notification.sound=Uri.parse("file:///sdcard/mp3/nobody.mp3");
109 | notificationManager.notify(R.layout.notification, notification);
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/src/com/cellcom/AlertDialogActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import android.app.Activity;
4 | import android.app.AlertDialog;
5 | import android.app.AlertDialog.Builder;
6 | import android.app.ProgressDialog;
7 | import android.content.DialogInterface;
8 | import android.os.Bundle;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.widget.Button;
12 | import android.widget.EditText;
13 | import android.widget.Toast;
14 |
15 | import com.roxstudio.proxycomponent.Proxied;
16 |
17 | //对话框测试
18 | public class AlertDialogActivity extends Proxied {
19 |
20 | private Button button1;
21 | private Button button2;
22 | private Button button3;
23 | private Button button4;
24 |
25 | @Override
26 | protected void onCreate(Bundle savedInstanceState) {
27 | super.onCreate(savedInstanceState);
28 | setContentView(R.layout.alert_dialog);
29 | setTitle("4种对话框!");
30 |
31 | button1=(Button)findViewById(R.id.button1);
32 | button2=(Button)findViewById(R.id.button2);
33 | button3=(Button)findViewById(R.id.button3);
34 | button4=(Button)findViewById(R.id.button4);
35 |
36 | //第一种对话框
37 | button1.setOnClickListener(new View.OnClickListener() {
38 | @Override
39 | public void onClick(View v) {
40 | Builder builder=new AlertDialog.Builder(AlertDialogActivity.this.asActivity());
41 | builder.setIcon(R.drawable.alert_dialog_icon);
42 | builder.setTitle("哇哈哈!");
43 | builder.setMessage("去不去?");
44 | builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
45 | @Override
46 | public void onClick(DialogInterface dialog, int which) {
47 | Toast.makeText(AlertDialogActivity.this.asActivity(), "你选择了确定按钮!", Toast.LENGTH_SHORT).show();
48 | }
49 | });
50 | builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
51 | @Override
52 | public void onClick(DialogInterface dialog, int which) {
53 | Toast.makeText(AlertDialogActivity.this.asActivity(), "你选择了取消按钮!", Toast.LENGTH_SHORT).show();
54 | }
55 | });
56 | builder.show();
57 | }
58 | });
59 |
60 | //第二种对话框
61 | button2.setOnClickListener(new View.OnClickListener() {
62 | @Override
63 | public void onClick(View v) {
64 | new AlertDialog.Builder(AlertDialogActivity.this.asActivity())
65 | .setIcon(R.drawable.alert_dialog_icon)
66 | .setTitle("温馨提示")
67 | .setMessage("提示内容:三个按钮")
68 | .setPositiveButton("确定", new DialogInterface.OnClickListener() {
69 | @Override
70 | public void onClick(DialogInterface dialog, int which) {
71 | Toast.makeText(AlertDialogActivity.this.asActivity(), "你选择了确定按钮!", Toast.LENGTH_SHORT).show();
72 | }
73 | })
74 | .setNeutralButton("详情", new DialogInterface.OnClickListener() {
75 | @Override
76 | public void onClick(DialogInterface dialog, int which) {
77 | Toast.makeText(AlertDialogActivity.this.asActivity(), "你选择了详情按钮!", Toast.LENGTH_SHORT).show();
78 | }
79 | })
80 | .setNegativeButton("取消", new DialogInterface.OnClickListener() {
81 | @Override
82 | public void onClick(DialogInterface dialog, int which) {
83 | Toast.makeText(AlertDialogActivity.this.asActivity(), "你选择了取消按钮!", Toast.LENGTH_SHORT).show();
84 | }
85 | })
86 | .show();
87 | }
88 | });
89 |
90 | //第三种按钮
91 | button3.setOnClickListener(new View.OnClickListener() {
92 | @Override
93 | public void onClick(View v) {
94 | LayoutInflater inflater=LayoutInflater.from(AlertDialogActivity.this.asActivity());
95 | final View textEntryView=inflater.inflate(R.layout.alert_dialog_text_entry, null);
96 |
97 | final EditText usernameET=(EditText)textEntryView.findViewById(R.id.username_value);
98 | final EditText passwordET=(EditText)textEntryView.findViewById(R.id.password_value);
99 | //final String username=usernameET.getText().toString();
100 |
101 | new AlertDialog.Builder(AlertDialogActivity.this.asActivity())
102 | .setIcon(R.drawable.alert_dialog_icon)
103 | .setTitle("温馨提醒")
104 | .setView(textEntryView)
105 | .setPositiveButton("确定", new DialogInterface.OnClickListener() {
106 | @Override
107 | public void onClick(DialogInterface dialog, int which) {
108 | Toast.makeText(AlertDialogActivity.this.asActivity(), "用户名="+usernameET.getText().toString()+"\n密码="+passwordET.getText().toString(), Toast.LENGTH_LONG).show();
109 | }
110 | })
111 | .setNegativeButton("取消", new DialogInterface.OnClickListener() {
112 | @Override
113 | public void onClick(DialogInterface dialog, int which) {
114 | Toast.makeText(AlertDialogActivity.this.asActivity(), "你选择了确定取消!", Toast.LENGTH_SHORT).show();
115 | }
116 | })
117 | .show();
118 | }
119 | });
120 |
121 | //第四种对话框
122 | button4.setOnClickListener(new View.OnClickListener() {
123 | @Override
124 | public void onClick(View v) {
125 | ProgressDialog dialog=new ProgressDialog(AlertDialogActivity.this.asActivity());
126 | dialog.setTitle("处理中。。。");
127 | dialog.setMessage("请稍后。。。");
128 | dialog.show();
129 | }
130 | });
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/assets/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
13 |
14 |
15 |
20 |
21 |
25 |
31 |
37 |
38 |
39 |
40 |
44 |
50 |
56 |
57 |
58 |
59 |
63 |
69 |
75 |
76 |
77 |
81 |
87 |
93 |
94 |
95 |
99 |
105 |
111 |
112 |
113 |
117 |
123 |
129 |
130 |
131 |
135 |
141 |
147 |
148 |
149 |
153 |
159 |
165 |
171 |
172 |
173 |
177 |
183 |
184 |
190 |
191 |
197 |
198 |
199 |
203 |
209 |
210 |
216 |
217 |
223 |
224 |
225 |
226 |
227 |
--------------------------------------------------------------------------------
/res/layout/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
13 |
14 |
15 |
20 |
21 |
25 |
31 |
37 |
43 |
44 |
45 |
46 |
50 |
56 |
62 |
63 |
64 |
65 |
69 |
75 |
81 |
82 |
83 |
87 |
93 |
99 |
100 |
101 |
105 |
111 |
117 |
118 |
119 |
123 |
129 |
135 |
136 |
137 |
141 |
147 |
153 |
154 |
155 |
159 |
165 |
171 |
177 |
178 |
179 |
183 |
189 |
190 |
196 |
197 |
203 |
204 |
205 |
209 |
215 |
230 |
231 |
232 |
233 |
234 |
--------------------------------------------------------------------------------
/src/com/cellcom/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.cellcom;
2 |
3 | import java.io.File;
4 | import java.lang.reflect.Method;
5 | import java.lang.reflect.Modifier;
6 | import java.util.ArrayList;
7 | import java.util.HashMap;
8 | import java.util.Map;
9 |
10 | import android.app.Activity;
11 | import android.app.ActivityGroup;
12 | import android.app.ListActivity;
13 | import android.app.TabActivity;
14 | import android.content.Context;
15 | import android.content.Intent;
16 | import android.os.Bundle;
17 | import android.support.v4.app.FragmentActivity;
18 | import android.view.View;
19 | import android.widget.Button;
20 |
21 | import com.roxstudio.proxycomponent.Proxied;
22 | import com.roxstudio.utils.Util;
23 |
24 | /**
25 | * @author nwang
26 | *
27 | * android基本布局、组件等等操作!
28 | */
29 | public class MainActivity extends Proxied {
30 | /** Called when the activity is first created. */
31 |
32 | private Button frameLayout;
33 | private Button relativeLayout;
34 | private Button relativeAndLinear;
35 | private Button tableLayout;
36 | //选项卡按钮
37 | private Button tabWidget;
38 | private Button checkbox;
39 | private Button radionGroup;
40 | private Button spinner;
41 | private Button autoCompleteTextView;
42 | private Button datePicker;
43 | private Button progressBar;
44 | private Button ratingBar;
45 | private Button imageShow;
46 | private Button gridView;
47 | private Button tabDemo;
48 | private Button menu1;
49 | private Button menu2;
50 | private Button menu3;
51 | private Button bundle;
52 | private Button alertDialog;
53 | private Button notification;
54 |
55 | public static final ClassLoader getProxiedClassLoader(Context context) {
56 | Object ldr2 = context.getClassLoader();
57 | return (ClassLoader) ldr2;
58 | }
59 |
60 | @Override
61 | public void onCreate(Bundle savedInstanceState) {
62 | super.onCreate(savedInstanceState);
63 | setContentView(R.layout.main);
64 |
65 |
66 | // genActivityCode(ListActivity.class);
67 |
68 |
69 |
70 | frameLayout=(Button)findViewById(R.id.frameLayout);
71 | relativeLayout=(Button)findViewById(R.id.relativeLayout);
72 | relativeAndLinear=(Button)findViewById(R.id.relativeAndLinear);
73 | tableLayout=(Button)findViewById(R.id.tableLayout);
74 | tabWidget=(Button)findViewById(R.id.tabWidget);
75 | checkbox=(Button)findViewById(R.id.checkbox);
76 | radionGroup=(Button)findViewById(R.id.radioGroup);
77 | spinner=(Button)findViewById(R.id.spinner);
78 | autoCompleteTextView=(Button)findViewById(R.id.autoCompleteTextView);
79 | datePicker=(Button)findViewById(R.id.datePicker);
80 | progressBar=(Button)findViewById(R.id.progressBar);
81 | ratingBar=(Button)findViewById(R.id.ratingBar);
82 | imageShow=(Button)findViewById(R.id.imageShow);
83 | gridView=(Button)findViewById(R.id.gridView);
84 | tabDemo=(Button)findViewById(R.id.tabDemo);
85 | menu1=(Button)findViewById(R.id.menu1);
86 | menu2=(Button)findViewById(R.id.menu2);
87 | menu3=(Button)findViewById(R.id.menu3);
88 | bundle=(Button)findViewById(R.id.bundle);
89 | alertDialog=(Button)findViewById(R.id.alertDialog);
90 | notification=(Button)findViewById(R.id.notification);
91 |
92 | //FrameLayout布局使用
93 | frameLayout.setOnClickListener(new View.OnClickListener() {
94 | public void onClick(View v) {
95 | Intent intent=new Intent();
96 | intent.setClass(MainActivity.this.asActivity(), FrameLayoutActivity.class);
97 | startActivity(intent);
98 | }
99 | });
100 |
101 | //RelativeLayout布局使用
102 | relativeLayout.setOnClickListener(new View.OnClickListener() {
103 | @Override
104 | public void onClick(View v) {
105 | Intent intent=new Intent();
106 | intent.setClass(MainActivity.this.asActivity(), RelativeLayoutActivity.class);
107 | startActivity(intent);
108 | }
109 | });
110 |
111 | //RelativeLayout和LinearLayout综合使用
112 | relativeAndLinear.setOnClickListener(new View.OnClickListener() {
113 | @Override
114 | public void onClick(View v) {
115 | Intent intent=new Intent();
116 | intent.setClass(MainActivity.this.asActivity(), RelativeAndLinearActivity.class);
117 | startActivity(intent);
118 | }
119 | });
120 |
121 | //TableLayout布局使用
122 | tableLayout.setOnClickListener(new View.OnClickListener() {
123 |
124 | @Override
125 | public void onClick(View v) {
126 | Intent intent=new Intent();
127 | intent.setClass(MainActivity.this.asActivity(), TableLayoutActivity.class);
128 | startActivity(intent);
129 | }
130 | });
131 |
132 | //切换选项卡TabWidget
133 | tabWidget.setOnClickListener(new View.OnClickListener() {
134 | @Override
135 | public void onClick(View v) {
136 | Intent intent=new Intent();
137 | intent.setClass(MainActivity.this.asActivity(), TabWidgetActivity.class);
138 | startActivity(intent);
139 | }
140 | });
141 |
142 | //多选控件CheckBox
143 | checkbox.setOnClickListener(new View.OnClickListener() {
144 | @Override
145 | public void onClick(View v) {
146 | Intent intent=new Intent();
147 | intent.setClass(MainActivity.this.asActivity(), CheckBoxActivity.class);
148 | startActivity(intent);
149 | }
150 | });
151 |
152 | //单选控件RadioGroup使用
153 | radionGroup.setOnClickListener(new View.OnClickListener() {
154 | @Override
155 | public void onClick(View v) {
156 | Intent intent=new Intent();
157 | intent.setClass(MainActivity.this.asActivity(), RadioGroupActivity.class);
158 | startActivity(intent);
159 | }
160 | });
161 |
162 | //下拉框使用
163 | spinner.setOnClickListener(new View.OnClickListener() {
164 | @Override
165 | public void onClick(View v) {
166 | Intent intent=new Intent();
167 | intent.setClass(MainActivity.this.asActivity(), SpinnerActivity.class);
168 | startActivity(intent);
169 | }
170 | });
171 |
172 | //自动提示框
173 | autoCompleteTextView.setOnClickListener(new View.OnClickListener() {
174 | @Override
175 | public void onClick(View v) {
176 | Intent intent =new Intent();
177 | intent.setClass(MainActivity.this.asActivity(), AutoCompleteTextViewActivity.class);
178 | startActivity(intent);
179 | }
180 | });
181 |
182 | //日期选择器使用
183 | datePicker.setOnClickListener(new View.OnClickListener() {
184 | @Override
185 | public void onClick(View v) {
186 | Intent intent=new Intent();
187 | intent.setClass(MainActivity.this.asActivity(), DatePickerActivity.class);
188 | startActivity(intent);
189 | }
190 | });
191 |
192 | //进度条使用
193 | progressBar.setOnClickListener(new View.OnClickListener() {
194 | @Override
195 | public void onClick(View v) {
196 | Intent intent=new Intent();
197 | intent.setClass(MainActivity.this.asActivity(), ProgressBarHandlerActivity.class);
198 | startActivity(intent);
199 | }
200 | });
201 |
202 | //评分组件RatingBar
203 | ratingBar.setOnClickListener(new View.OnClickListener() {
204 | @Override
205 | public void onClick(View v) {
206 | Intent intent=new Intent();
207 | intent.setClass(MainActivity.this.asActivity(), RatingBarActivity.class);
208 | startActivity(intent);
209 | }
210 | });
211 |
212 | //浏览图片
213 | imageShow.setOnClickListener(new View.OnClickListener() {
214 | @Override
215 | public void onClick(View v) {
216 | Intent intent=new Intent();
217 | intent.setClass(MainActivity.this.asActivity(), ImageShowActivity.class);
218 | startActivity(intent);
219 | }
220 | });
221 |
222 | //网络视图
223 | gridView.setOnClickListener(new View.OnClickListener() {
224 | @Override
225 | public void onClick(View v) {
226 | Intent intent=new Intent();
227 | intent.setClass(MainActivity.this.asActivity(), GridViewActivity.class);
228 | startActivity(intent);
229 | }
230 | });
231 |
232 | //标签控件tab
233 | tabDemo.setOnClickListener(new View.OnClickListener() {
234 | @Override
235 | public void onClick(View v) {
236 | Intent intent=new Intent();
237 | intent.setClass(MainActivity.this.asActivity(), TabDemoActivity.class);
238 | startActivity(intent);
239 | }
240 | });
241 |
242 | //OptionsMenu菜单
243 | menu1.setOnClickListener(new View.OnClickListener() {
244 | @Override
245 | public void onClick(View v) {
246 | Intent intent=new Intent();
247 | intent.setClass(MainActivity.this.asActivity(), OptionsMenuActivity.class);
248 | startActivity(intent);
249 | }
250 | });
251 |
252 | //ContextMenu菜单
253 | menu2.setOnClickListener(new View.OnClickListener() {
254 | @Override
255 | public void onClick(View v) {
256 | Intent intent=new Intent();
257 | intent.setClass(MainActivity.this.asActivity(), ContextMenuActivity.class);
258 | startActivity(intent);
259 | }
260 | });
261 |
262 | //SubMenu菜单
263 | menu3.setOnClickListener(new View.OnClickListener() {
264 | @Override
265 | public void onClick(View v) {
266 | Intent intent=new Intent();
267 | intent.setClass(MainActivity.this.asActivity(), SubMenuActivity.class);
268 | startActivity(intent);
269 | }
270 | });
271 |
272 | //Activity值传递
273 | bundle.setOnClickListener(new View.OnClickListener() {
274 | @Override
275 | public void onClick(View v) {
276 | Intent intent=new Intent();
277 | intent.setClass(MainActivity.this.asActivity(), Bundle1Activity.class);
278 | startActivity(intent);
279 | }
280 | });
281 |
282 | //4中对话框
283 | alertDialog.setOnClickListener(new View.OnClickListener() {
284 | @Override
285 | public void onClick(View v) {
286 | Intent intent=new Intent();
287 | intent.setClass(MainActivity.this.asActivity(), AlertDialogActivity.class);
288 | startActivity(intent);
289 | }
290 | });
291 |
292 | //Notification状态栏提示
293 | notification.setOnClickListener(new View.OnClickListener() {
294 | @Override
295 | public void onClick(View v) {
296 | Intent intent=new Intent();
297 | intent.setClass(MainActivity.this.asActivity(), NotificationActivity.class);
298 | startActivity(intent);
299 | }
300 | });
301 | }
302 |
303 | private static final Map subst = Util.newMap(String.class, String.class);
304 | private static final String methodTempl =
305 | "\t/** from class ${class} */\r\n" +
306 | "\t${modifier} ${returnType} ${name}(${parameters})${throw} {\r\n" +
307 | "${body}\t}\r\n\r\n";
308 | private static final String caseTempl =
309 | "\t\t\tcase ${index}: ${body}\r\n";
310 | private static final HashMap classIndices = Util.newMap(
311 | Class.class, Integer.class,
312 | ActivityGroup.class, 4,
313 | TabActivity.class, 5,
314 | FragmentActivity.class, 6,
315 | ListActivity.class, 7);
316 | private static HashMap methodIndices = new HashMap();
317 |
318 | void genActivityCode(Class> cls) {
319 | StringBuilder sb1 = new StringBuilder(), sb11 = new StringBuilder(), sb2 = new StringBuilder();
320 | sb11.append("\t@Override\r\n\tpublic Object _s_(Object[] a) {\r\n\t\ttry {\r\n\t\t\tswitch ((Integer) a[0]) {\r\n");
321 | ArrayList> classes = new ArrayList>();
322 | while (cls != Object.class) {
323 | classes.add(cls);
324 | cls = cls.getSuperclass();
325 | }
326 | for (int i = classes.size(); --i >= 0;) {
327 | cls = classes.get(i);
328 | Integer baseIndex = classIndices.get(cls);
329 | if (baseIndex == null) baseIndex = classes.size() - 1 - i;
330 | int j = 0;
331 | sb11.append("\t\t\t/**** ").append("from class ").append(className(cls, false)).append(" ****/\r\n");
332 | for (Method m: cls.getDeclaredMethods()) {
333 | int modifier = m.getModifiers() & ~Modifier.ABSTRACT;
334 | if ((modifier & (Modifier.PROTECTED | Modifier.PUBLIC)) == 0) continue;
335 | String methodSign = m.getName() + "@" + Util.getSignature(m.getParameterTypes());
336 | if (methodIndices.containsKey(methodSign)) continue;
337 | int index = baseIndex * 1000 + (j++);
338 | methodIndices.put(methodSign, index);
339 | if ((modifier & Modifier.FINAL) == 0) { // not final
340 | Util.mapPut(subst,
341 | "class", cls.getName(),
342 | "modifier", Modifier.toString(modifier),
343 | "returnType", className(m.getReturnType(), false),
344 | "name", m.getName(),
345 | "parameters", parameters(m.getParameterTypes()),
346 | "throw", exceptions(m.getExceptionTypes()),
347 | "body", proxyBody(m));
348 | sb1.append(Util.substitute(methodTempl, subst));
349 | Util.mapPut(subst,
350 | "index", Integer.toString(index),
351 | "body", caseBody(m));
352 | sb11.append(Util.substitute(caseTempl, subst));
353 | Util.mapPut(subst,
354 | "modifier", Modifier.toString(modifier),
355 | "name", m.getName(),
356 | "body", body(m, true));
357 | sb2.append(Util.substitute(methodTempl, subst));
358 | } else {
359 | Util.mapPut(subst,
360 | "class", cls.getName(),
361 | "modifier", Modifier.toString(modifier),
362 | "returnType", className(m.getReturnType(), false),
363 | "name", m.getName(),
364 | "parameters", parameters(m.getParameterTypes()),
365 | "throw", exceptions(m.getExceptionTypes()),
366 | "body", body(m, false));
367 | sb2.append(Util.substitute(methodTempl, subst));
368 | }
369 | }
370 | }
371 | sb11.append("\t\t\t}\r\n\t\t} catch (Throwable ex) {\r\n\t\t\tthrow new RuntimeException(ex);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n");
372 | Util.writeToFile(sb1.toString() + sb11.toString(), new File("/sdcard/ProxyActivity.txt"));
373 | Util.writeToFile(sb2.toString(), new File("/sdcard/Proxied.txt"));
374 | }
375 |
376 | String parameters(Class>[] parameterTypes) {
377 | StringBuilder sb = new StringBuilder();
378 | int i = 0;
379 | for (Class> c: parameterTypes) {
380 | if (i > 0) sb.append(", ");
381 | sb.append(className(c, false)).append(" a").append(i);
382 | i++;
383 | }
384 | return sb.toString();
385 | }
386 |
387 | private static final HashMap BOX = Util.newMap(
388 | Class.class, Class.class,
389 | byte.class, Byte.class,
390 | char.class, Character.class,
391 | double.class, Double.class,
392 | float.class, Float.class,
393 | int.class, Integer.class,
394 | long.class, Long.class,
395 | short.class, Short.class,
396 | void.class, Void.class,
397 | boolean.class, Boolean.class);
398 |
399 | String className(Class> cls, boolean boxed) {
400 | StringBuilder sb = new StringBuilder();
401 | int dimensions = 0;
402 | while (cls.isArray()) {
403 | cls = cls.getComponentType();
404 | dimensions++;
405 | }
406 | String clsName = cls.getName().replace('$', '.');
407 | if (cls.isPrimitive() && dimensions == 0 && boxed) {
408 | clsName = BOX.get(cls).getName();
409 | }
410 | if (clsName.startsWith("java.lang.")) clsName = clsName.substring(10);
411 | sb.append(clsName);
412 | while (--dimensions >= 0) sb.append("[]");
413 | return sb.toString();
414 | }
415 |
416 | String exceptions(Class>[] exceptionTypes) {
417 | if (exceptionTypes.length == 0) return "";
418 | StringBuilder sb = new StringBuilder(" throws ");
419 | boolean first = true;
420 | for (Class> cls: exceptionTypes) {
421 | if (first) first = false; else sb.append(", ");
422 | sb.append(className(cls, false));
423 | }
424 | return sb.toString();
425 | }
426 |
427 | String body(Method m, boolean isSuper) {
428 | StringBuilder sb = new StringBuilder("\t\t");
429 | if (isSuper) {
430 | if (m.getReturnType() != Void.TYPE) {
431 | sb.append("return ").append('(').append(className(m.getReturnType(), true)).append(") ");
432 | }
433 | int index = methodIndices.get(m.getName() + "@" + Util.getSignature(m.getParameterTypes()));
434 | sb.append("proxy._s_(new Object[] { ").append(index);
435 | for (int i = 0, n = m.getParameterTypes().length; i < n; i++) {
436 | sb.append(", ").append("a").append(i);
437 | }
438 | sb.append(" } );\r\n");
439 | } else {
440 | if (m.getReturnType() != Void.TYPE) sb.append("return ");
441 | sb.append("((").append(className(m.getDeclaringClass(), false)).append(") proxy).")
442 | .append(m.getName()).append('(');
443 | for (int i = 0, n = m.getParameterTypes().length; i < n; i++) {
444 | if (i > 0) sb.append(", ");
445 | sb.append("a").append(i);
446 | }
447 | sb.append(");\r\n");
448 | }
449 | return sb.toString();
450 | }
451 |
452 | private static final String proxyBodyTempl1 = "\t\treturn proxied != null ? proxied.${name}(${args}) : super.${name}(${args});\r\n";
453 | private static final String proxyBodyTempl2 = "\t\tif (proxied != null) proxied.${name}(${args}); else super.${name}(${args});\r\n";
454 | String proxyBody(Method m) {
455 | StringBuilder args = new StringBuilder();
456 | for (int i = 0, n = m.getParameterTypes().length; i < n; i++) {
457 | if (i > 0) args.append(", ");
458 | args.append("a").append(i);
459 | }
460 | HashMap subst = Util.newMap(String.class, String.class, "name", m.getName(), "args", args.toString());
461 | return m.getReturnType() != Void.TYPE ? Util.substitute(proxyBodyTempl1, subst)
462 | : Util.substitute(proxyBodyTempl2, subst);
463 | }
464 |
465 | String caseBody(Method m) {
466 | StringBuilder sb = new StringBuilder();
467 | boolean isVoid = m.getReturnType() == Void.TYPE;
468 | if (!isVoid) sb.append("return ");
469 | sb.append("super.").append(m.getName()).append('(');
470 | Class>[] pt = m.getParameterTypes();
471 | for (int i = 0, n = pt.length; i < n; i++) {
472 | if (i > 0) sb.append(", ");
473 | sb.append('(').append(className(pt[i], true)).append(") a[").append(i + 1).append(']');
474 | }
475 | sb.append(");");
476 | if (isVoid) sb.append(" break;");
477 | return sb.toString();
478 | }
479 |
480 | }
--------------------------------------------------------------------------------
/src/com/roxstudio/utils/Util.java:
--------------------------------------------------------------------------------
1 | package com.roxstudio.utils;
2 |
3 | import java.io.BufferedInputStream;
4 | import java.io.ByteArrayOutputStream;
5 | import java.io.File;
6 | import java.io.FileInputStream;
7 | import java.io.FileOutputStream;
8 | import java.io.IOException;
9 | import java.io.InputStream;
10 | import java.io.OutputStream;
11 | import java.io.UnsupportedEncodingException;
12 | import java.lang.reflect.Array;
13 | import java.lang.reflect.Constructor;
14 | import java.lang.reflect.Field;
15 | import java.lang.reflect.Member;
16 | import java.lang.reflect.Method;
17 | import java.security.MessageDigest;
18 | import java.text.SimpleDateFormat;
19 | import java.util.ArrayList;
20 | import java.util.Collection;
21 | import java.util.Date;
22 | import java.util.HashMap;
23 | import java.util.List;
24 | import java.util.Map;
25 | import java.util.Timer;
26 | import java.util.TimerTask;
27 | import java.util.regex.Matcher;
28 | import java.util.regex.Pattern;
29 | import java.util.zip.ZipEntry;
30 | import java.util.zip.ZipInputStream;
31 |
32 | import android.annotation.SuppressLint;
33 | import android.content.Context;
34 | import android.util.DisplayMetrics;
35 | import android.util.TypedValue;
36 |
37 | @SuppressLint({ "SimpleDateFormat", "DefaultLocale" })
38 | final public class Util {
39 |
40 | public static void runWithTimeCheck(Runnable task, int timeout, TimerTask taskBlockAction) {
41 | Timer timer = new Timer();
42 | timer.schedule(taskBlockAction, timeout);
43 | long tm = System.currentTimeMillis();
44 | task.run();
45 | if (System.currentTimeMillis() - tm < timeout) timer.cancel();
46 | }
47 |
48 | public static final V mapGet(Map map, K key, V fallback) {
49 | V v;
50 | return (v = map.get(key)) != null ? v : fallback;
51 | }
52 |
53 | @SafeVarargs
54 | public static final void mapListAdd(Map> map, K key, V... val) {
55 | ArrayList l;
56 | if ((l = map.get(key)) == null) map.put(key, l = new ArrayList());
57 | for (V v: val) l.add(v);
58 | }
59 |
60 | public static final V mapMapGet(Map> map, K key, S subkey, V fallback) {
61 | HashMap m;
62 | V ret;
63 | return (m = map.get(key)) != null && (ret = m.get(subkey)) != null ? ret : fallback;
64 | }
65 |
66 | public static final void mapMapAdd(Map> map, K key, S subkey, V val) {
67 | HashMap m;
68 | if ((m = map.get(key)) == null) map.put(key, m = new HashMap());
69 | m.put(subkey, val);
70 | }
71 |
72 | public static final boolean empty(Collection c) {
73 | return c == null || c.size() == 0;
74 | }
75 |
76 | public static final boolean empty(Map m) {
77 | return m == null || m.size() == 0;
78 | }
79 |
80 | public static final boolean empty(String s) {
81 | return s == null || s.length() == 0;
82 | }
83 |
84 | public static final String ifEmpty(String s, String fallback) {
85 | return Util.empty(s) ? fallback : s;
86 | }
87 |
88 | public static final Map safeMap(Map map) {
89 | return map != null ? map : new HashMap(0);
90 | }
91 |
92 | public static final Iterable safeIter(Iterable iter) {
93 | return iter != null ? iter : new ArrayList(0);
94 | }
95 |
96 | @SuppressWarnings("unchecked")
97 | public static final T[] safeArray(T[] array, Class componentType) {
98 | return array != null ? array : (T[]) Array.newInstance(componentType, 0);
99 | }
100 |
101 | public static final int[] safeArray(int[] array) {
102 | return array != null ? array : new int[0];
103 | }
104 |
105 | public static final long[] safeArray(long[] array) {
106 | return array != null ? array : new long[0];
107 | }
108 |
109 | public static final short[] safeArray(short[] array) {
110 | return array != null ? array : new short[0];
111 | }
112 |
113 | public static final byte[] safeArray(byte[] array) {
114 | return array != null ? array : new byte[0];
115 | }
116 |
117 | public static final char[] safeArray(char[] array) {
118 | return array != null ? array : new char[0];
119 | }
120 |
121 | public static final boolean[] safeArray(boolean[] array) {
122 | return array != null ? array : new boolean[0];
123 | }
124 |
125 | public static final float[] safeArray(float[] array) {
126 | return array != null ? array : new float[0];
127 | }
128 |
129 | public static final double[] safeArray(double[] array) {
130 | return array != null ? array : new double[0];
131 | }
132 |
133 | public static final HashMap safePut(HashMap map, K k, V v) {
134 | if (map == null) map = new HashMap();
135 | map.put(k, v);
136 | return map;
137 | }
138 |
139 | public static final HashMap newMap(Class keyClass, Class valClass, Object... keyValuePairs) {
140 | return (HashMap) mapPut(new HashMap(), keyValuePairs);
141 | }
142 |
143 | @SuppressWarnings("unchecked")
144 | public static final Map mapPut(Map map, Object... keyValuePairs) {
145 | if ((keyValuePairs.length & 1) != 0)
146 | throw new IllegalArgumentException("the number of keyValuePairs arguments must be odd");
147 | for (int i = 0, n = keyValuePairs.length; i < n; i += 2) {
148 | map.put((K) keyValuePairs[i], (V) keyValuePairs[i + 1]);
149 | }
150 | return map;
151 | }
152 |
153 | @SafeVarargs
154 | public static final ArrayList newList(T... values) {
155 | return (ArrayList) listAdd(new ArrayList(values.length), values);
156 | }
157 |
158 | @SafeVarargs
159 | public static final List listAdd(List list, T... values) {
160 | for (T v: values) list.add(v);
161 | return list;
162 | }
163 |
164 | @SuppressWarnings("unchecked")
165 | public static final T[] arraySet(T[] array, Object... indexValuePairs) {
166 | if ((indexValuePairs.length & 1) != 0)
167 | throw new IllegalArgumentException("the number of indexValuePairs arguments must be odd");
168 | for (int i = 0, n = indexValuePairs.length; i < n; i += 2) {
169 | array[(Integer) indexValuePairs[i]] = (T) indexValuePairs[i + 1];
170 | }
171 | return array;
172 | }
173 |
174 | public static final String zeroPad(Number val, int len) {
175 | String s = val.toString();
176 | int l;
177 | if ((l = s.length()) < len) {
178 | StringBuilder buf = new StringBuilder();
179 | for (int i = len - l; --i >= 0; buf.append('0'));
180 | return buf.append(s).toString();
181 | }
182 | return s;
183 | }
184 |
185 | public static final String bytesToString(byte[] bb) {
186 | try {
187 | int start = bb.length >= 3 && bb[0] == 0xEF && bb[1] == 0xBB && bb[2] == 0xBF ? 3 : 0;
188 | return new String(bb, start, bb.length - start, "UTF-8");
189 | } catch (UnsupportedEncodingException e) { }
190 | return null;
191 | }
192 |
193 | public static final byte[] stringToBytes(String s) {
194 | try {
195 | return s.getBytes("UTF-8");
196 | } catch (UnsupportedEncodingException e) { }
197 | return null;
198 | }
199 |
200 | public static final byte[] readStream(InputStream is) {
201 | try {
202 | ByteArrayOutputStream bos = new ByteArrayOutputStream();
203 | BufferedInputStream bis = new BufferedInputStream(is);
204 | byte[] bb = new byte[100000];
205 | for (int len = bis.read(bb); len > 0; len = bis.read(bb)) {
206 | bos.write(bb, 0, len);
207 | }
208 | return bos.toByteArray();
209 | } catch (IOException e) {
210 | e.printStackTrace();
211 | }
212 | return null;
213 | }
214 |
215 | public static final String readText(InputStream is) {
216 | return bytesToString(readStream(is));
217 | }
218 |
219 | public static final String loadAssetsText(Context context, String name) {
220 | try {
221 | InputStream is = context.getResources().getAssets().open(name);
222 | String s = readText(is);
223 | is.close();
224 | return s;
225 | } catch (IOException e) {
226 | e.printStackTrace();
227 | }
228 | return null;
229 | }
230 |
231 | public static final String loadLocalText(String path) {
232 | try {
233 | InputStream is = new FileInputStream(path);
234 | String s = readText(is);
235 | is.close();
236 | return s;
237 | } catch (IOException e) {
238 | e.printStackTrace();
239 | }
240 | return null;
241 | }
242 |
243 | public static final boolean assetExist(Context context, String name) {
244 | boolean exists = false;
245 | try {
246 | InputStream is = context.getResources().getAssets().open(name);
247 | exists = is != null;
248 | is.close();
249 | } catch (IOException e) {
250 | // e.printStackTrace();
251 | }
252 | return exists;
253 | }
254 |
255 | public static final void writeToFile(byte[] bb, File output) {
256 | try {
257 | output.getParentFile().mkdirs();
258 | OutputStream os = new FileOutputStream(output);
259 | os.write(bb);
260 | os.close();
261 | } catch (IOException e) {
262 | e.printStackTrace();
263 | }
264 | }
265 |
266 | public static final void writeToFile(String text, File output) {
267 | writeToFile(stringToBytes(text), output);
268 | }
269 |
270 | public static final int dp2px(Context context, float dp) {
271 | DisplayMetrics dm = context.getResources().getDisplayMetrics();
272 | return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, dm);
273 | }
274 |
275 | public static final int sp2px(Context context, float sp) {
276 | DisplayMetrics dm = context.getResources().getDisplayMetrics();
277 | return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, dm);
278 | }
279 |
280 | public static final float px2dp(Context context, float px) {
281 | final float scale = context.getResources().getDisplayMetrics().density;
282 | return px / scale;
283 | }
284 |
285 | private static final HashMap formatters = new HashMap();
286 |
287 | public static final Date parseDate(String pattern, String dateStr) {
288 | SimpleDateFormat fmt = formatters.get("pattern");
289 | if (fmt == null) formatters.put(pattern, fmt = new SimpleDateFormat(pattern));
290 | try {
291 | return fmt.parse(dateStr);
292 | } catch (Exception ex) {
293 | throw new IllegalArgumentException("parseDate: pattern=" + pattern + ",dateStr=" + dateStr);
294 | }
295 | }
296 |
297 | public static final String formatDate(String pattern, Date date) {
298 | SimpleDateFormat fmt = formatters.get("pattern");
299 | if (fmt == null) formatters.put(pattern, fmt = new SimpleDateFormat(pattern));
300 | return fmt.format(date);
301 | }
302 |
303 | private static final char[] HEX = "0123456789ABCDEF".toCharArray();
304 |
305 | public static final String md5(String s, boolean upperCase) {
306 | try {
307 | MessageDigest digest = MessageDigest.getInstance("MD5");
308 | digest.reset();
309 | digest.update(s.getBytes("UTF-8"));
310 | byte[] bb = digest.digest();
311 | StringBuilder out = new StringBuilder();
312 | for (byte b: bb) out.append(HEX[(b & 0xF0) >>> 4]).append(HEX[b & 0x0F]);
313 | String result = out.toString();
314 | return upperCase ? result : result.toLowerCase();
315 | } catch (Exception e) { } // should never happen
316 | return null;
317 | }
318 |
319 | public static final String md5(String s) {
320 | return md5(s, true);
321 | }
322 |
323 |
324 | public static final String extract(String input, Pattern ptn, int groupId) {
325 | String[] groups = extract(input, ptn);
326 | return groups != null && groupId < groups.length ? groups[groupId] : null;
327 | }
328 |
329 | public static final String[] extract(String input, Pattern ptn) {
330 | Matcher mch = ptn.matcher(input);
331 | String[] ret = null;
332 | if (mch.find()) {
333 | ret = new String[mch.groupCount() + 1];
334 | for (int i = ret.length; --i >= 0; ret[i] = mch.group(i));
335 | }
336 | return ret;
337 | }
338 |
339 | private static final String[][] EMPTY_ARRAY = new String[0][0];
340 |
341 | public static final String[][] extractAll(String input, Pattern ptn) {
342 | Matcher mch = ptn.matcher(input);
343 | ArrayList ret = new ArrayList();
344 | while (mch.find()) {
345 | String[] match = new String[mch.groupCount() + 1];
346 | ret.add(match);
347 | for (int i = match.length; --i >= 0; match[i] = mch.group(i));
348 | }
349 | return ret.toArray(EMPTY_ARRAY);
350 | }
351 |
352 | private static final Pattern ptnSubst = Pattern.compile("\\$(\\{[a-zA-Z0-9\\._\\-]+\\}|[a-zA-Z0-9\\._\\-]+)");
353 | /**
354 | * Valid format: ${upay.goods_name} or $goods_price
355 | * @param src e.g.: "You're going to buy ${upay.goods_name} with $goods_price RMBs"
356 | * @param substitutions e.g.: { "upay.goods_name":"20 Diamonds", "goods_price":"20" }
357 | * @return
358 | */
359 | public static final String substitute(String src, Map substitutions) {
360 | int index = 0;
361 | StringBuilder sb = new StringBuilder();
362 | Matcher mch = ptnSubst.matcher(src);
363 | while (mch.find()) {
364 | sb.append(src, index, mch.start());
365 | String key = mch.group(1);
366 | if (key.startsWith("{")) key = key.substring(1, key.length() - 1);
367 | String value = substitutions.get(key);
368 | sb.append(value != null ? value : mch.group());
369 | index = mch.end();
370 | }
371 | sb.append(src, index, src.length());
372 | return sb.toString();
373 | }
374 |
375 | public static final void unzip(InputStream is, File outDir) {
376 | try {
377 | ZipInputStream zin = new ZipInputStream(is);
378 | ZipEntry ze = null;
379 | byte[] bb = new byte[200000];
380 | while ((ze = zin.getNextEntry()) != null) {
381 | if (ze.isDirectory()) {
382 | continue; // not handling dir
383 | } else {
384 | String filename = ze.getName();
385 | FileOutputStream fout = new FileOutputStream(new File(outDir, filename));
386 | for (int len = zin.read(bb); len > 0; len = zin.read(bb)) {
387 | fout.write(bb, 0, len);
388 | }
389 | zin.closeEntry();
390 | fout.close();
391 | }
392 | }
393 | is.close();
394 | } catch (Exception e) {
395 | e.printStackTrace();
396 | }
397 | }
398 |
399 | private static final long START_DATE = Util.parseDate("yyyyMMdd", "20140101").getTime();
400 | private static final char[] TABLE = {
401 | 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
402 | 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
403 | 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
404 | 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
405 | '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
406 | '-',
407 | '_'
408 | };
409 | private static HashMap reverseTable = null;
410 |
411 | /**
412 | * sn format: yyMMddHHuuuurrrrqq
413 | * @param sn
414 | * @param digitOnly
415 | * @return
416 | */
417 | public static final String shortenSn(String sn, boolean digitOnly) {
418 | long tradeDate = Util.parseDate("yyMMddHH", sn.substring(0, 8)).getTime();
419 | long high = (tradeDate - START_DATE) / 360000L + Integer.parseInt(sn.substring(16, 18));
420 | long low = Long.parseLong(sn.substring(8, 16));
421 | long shorten = high * 100000000L + low;
422 | if (shorten > 99999999999999L) {
423 | throw new IllegalArgumentException("trade date must be in 2014-01-01 ~ 2024-12-30");
424 | }
425 | if (digitOnly) return Util.zeroPad(shorten, 14);
426 | StringBuilder buf = new StringBuilder();
427 | for (int i = 8; --i >= 0;) {
428 | buf.append(TABLE[(int) (shorten & 0x3F)]);
429 | shorten >>= 6;
430 | }
431 | return buf.reverse().toString();
432 | }
433 |
434 | public static final String unshorten(String shortSn, boolean digitOnly) {
435 | if (digitOnly && shortSn.length() != 14 || !digitOnly && shortSn.length() != 8) {
436 | throw new IllegalArgumentException("shortSn=" + shortSn + ",digitOnly=" + digitOnly);
437 | }
438 | if (reverseTable == null) {
439 | HashMap rt = reverseTable = new HashMap();
440 | for (int i = TABLE.length; --i >= 0; rt.put(TABLE[i], i));
441 | }
442 | long shorten = 0L;
443 | if (digitOnly) {
444 | shorten = Long.parseLong(shortSn);
445 | } else {
446 | for (int i = 0; i < 8; i++) {
447 | shorten <<= 6;
448 | shorten += reverseTable.get(shortSn.charAt(i));
449 | }
450 | }
451 | long high = shorten / 100000000L;
452 | String low = Util.zeroPad(shorten % 100000000L, 8);
453 | String qq = Util.zeroPad(high % 10, 2);
454 | String date = Util.formatDate("yyMMddHH", new Date(high / 10L * 3600000L + START_DATE));
455 | return date + low + qq;
456 | }
457 |
458 | public static void deleteFile(File file) {
459 | if (file.isDirectory()) {
460 | for (File child: safeArray(file.listFiles(), File.class)) {
461 | deleteFile(child);
462 | }
463 | }
464 | file.delete();
465 | }
466 |
467 | public static final Class> getClass(String className, ClassLoader cl) {
468 | try {
469 | return (cl != null ? cl : Util.class.getClassLoader()).loadClass(className);
470 | } catch (ClassNotFoundException e) {
471 | return null;
472 | }
473 | }
474 |
475 | /**
476 | * 通过反射调用类的构造方法来创建一个该类对象
477 | * @param cls 类,不可为空
478 | * @param signature 构造方法的参数签名,可为null,为null则根据实参数量来查找构造方法
479 | * @param args
480 | * @return
481 | */
482 | @SuppressWarnings("unchecked")
483 | public static final T createInstance(Class cls, String signature, Object... args) {
484 | if (signature == null && args.length == 0) {
485 | try {
486 | return cls.newInstance();
487 | } catch (Exception ex) {
488 | throw new IllegalArgumentException(ex);
489 | }
490 | }
491 | return (T) invoke(null, cls, "", signature, args);
492 | }
493 |
494 | public static final boolean hasField(Object thiz, Class> cls, String fieldName) {
495 | ArrayList found = getMembers(thiz != null ? thiz.getClass() : cls, fieldName);
496 | for (MemberInfo mi: safeIter(found)) {
497 | if (mi.numArgs == -1) return true;
498 | }
499 | return false;
500 | }
501 |
502 | public static final Object getField(Object thiz, Class> cls, String fieldName, Object fallback) {
503 | if (thiz == null && cls == null || fieldName == null)
504 | throw new NullPointerException("inst=" + thiz + ",class=" + cls + ",field=" + fieldName);
505 | try {
506 | for (MemberInfo mi: safeIter(getMembers(thiz != null ? thiz.getClass() : cls, fieldName))) {
507 | if (-1 == mi.numArgs) return ((Field) mi.member).get(thiz);
508 | }
509 | } catch (Exception ex) { }
510 | return fallback;
511 | }
512 |
513 | public static final void setField(Object thiz, Class> cls, String fieldName, Object fieldValue) {
514 | if (thiz == null && cls == null || fieldName == null)
515 | throw new NullPointerException("inst=" + thiz + ",class=" + cls + ",field=" + fieldName);
516 | for (MemberInfo mi: safeIter(getMembers(thiz != null ? thiz.getClass() : cls, fieldName))) {
517 | if (-1 == mi.numArgs) {
518 | try {
519 | ((Field) mi.member).set(thiz, fieldValue);
520 | } catch (Exception ex) { }
521 | return;
522 | }
523 | }
524 | }
525 |
526 | public static final boolean hasMethod(Object thiz, Class> cls, String methodName, String signature) {
527 | if (thiz == null && cls == null || methodName == null)
528 | throw new NullPointerException("inst=" + thiz + ",class=" + cls + ",method=" + methodName);
529 | for (MemberInfo mi: safeIter(getMembers(thiz != null ? thiz.getClass() : cls, methodName))) {
530 | if (mi.numArgs >= 0 && (signature == null || signature.equals(mi.signature))) return true;
531 | }
532 | return false;
533 | }
534 |
535 | public static final Object invokeSilent(Object thiz, Class> cls, String methodName, String signature, Object... args) {
536 | try {
537 | return invoke(thiz, cls, methodName, signature, args);
538 | } catch (Exception ex) {}
539 | return null;
540 | }
541 |
542 | /**
543 | * 反射调用一个实例或静态方法
544 | * @param thiz 对象实例,如调用静态方法,则必须为null
545 | * @param cls 类,如thiz参数不为null则此参数忽略,直接使用该实例的类
546 | * @param methodName 方法名
547 | * @param signature 方法参数签名,如"ILjava.lang.String;",若为null则本方法根据传入的实参数量查找方法;
548 | * 如果存在多个参数数量相同的同名方法,则必须显式指定方法签名,本方法不会自动根据实参类型进行匹配查找
549 | * 内部类格式如"Ljava.util.Map$Entry;"
550 | * @param args 被调用方法的实参列表
551 | * @return 被调用方法的返回值
552 | */
553 | public static final Object invoke(Object thiz, Class> cls, String methodName, String signature, Object... args) {
554 | if (thiz == null && cls == null || methodName == null)
555 | throw new NullPointerException("inst=" + thiz + ",class=" + cls + ",method=" + methodName);
556 | ArrayList found = getMembers(thiz != null ? thiz.getClass() : cls, methodName);
557 | try {
558 | Member m = null;
559 | if (found == null) { // do nothing
560 | } else if (signature == null) {
561 | int len = args.length;
562 | for (MemberInfo mi: found) {
563 | if (len == mi.numArgs) {
564 | m = mi.member;
565 | break;
566 | }
567 | }
568 | } else {
569 | signature = signature.replace('/', '.');
570 | for (MemberInfo mi: found) {
571 | if (signature.equals(mi.signature)) {
572 | m = mi.member;
573 | break;
574 | }
575 | }
576 | }
577 | if (m == null) {
578 | StringBuilder msg = new StringBuilder().append('"').append(methodName).append('"');
579 | if (signature == null) {
580 | msg.append(" with " + args.length + " parameter(s)");
581 | } else {
582 | msg.append(" with signature \"" + signature + "\"");
583 | }
584 | throw new NoSuchMethodException(msg.toString());
585 | }
586 | return m instanceof Method ? ((Method) m).invoke(thiz, args) : ((Constructor>) m).newInstance(args);
587 | } catch (Exception ex) {
588 | throw new IllegalArgumentException(ex);
589 | }
590 | }
591 |
592 | /**
593 | * 清除传入类对应的内部缓存,仅用于使用新的ClassLoader重新载入类之后
594 | * @param cls
595 | */
596 | public static final void removeInvocationCache(Class> cls) {
597 | mapClassMembers.remove(cls);
598 | }
599 |
600 | @SuppressWarnings("rawtypes")
601 | private static final HashMap primaryTypes = Util.newMap(
602 | Class.class, Character.class,
603 | byte.class, 'B',
604 | char.class, 'C',
605 | double.class, 'D',
606 | float.class, 'F',
607 | int.class, 'I',
608 | long.class, 'J',
609 | short.class, 'S',
610 | void.class, 'V',
611 | boolean.class, 'Z');
612 |
613 | public static final String getSignature(Class>... types) {
614 | StringBuilder sb = new StringBuilder();
615 | for (Class> t: types) {
616 | while (t.isArray()) {
617 | sb.append('[');
618 | t = t.getComponentType();
619 | }
620 | Character c;
621 | if ((c = primaryTypes.get(t)) != null) {
622 | sb.append(c);
623 | } else {
624 | sb.append('L').append(t.getName()).append(';');
625 | }
626 | }
627 | return sb.toString();
628 | }
629 |
630 | private static final HashMap, HashMap>> mapClassMembers = new HashMap, HashMap>>();
631 |
632 | private static final ArrayList getMembers(Class> cls, String name) {
633 | if (!mapClassMembers.containsKey(cls)) {
634 | HashMap> map;
635 | mapClassMembers.put(cls, map = new HashMap>());
636 | if (cls.getConstructors() != null) {
637 | for (Constructor> c: cls.getConstructors()) {
638 | Class>[] ptypes = c.getParameterTypes();
639 | mapListAdd(map, "", new MemberInfo(getSignature(ptypes), ptypes.length, c));
640 | }
641 | }
642 | if (cls.getMethods() != null) {
643 | for (Method m: cls.getMethods()) {
644 | Class>[] ptypes = m.getParameterTypes();
645 | mapListAdd(map, m.getName(), new MemberInfo(getSignature(ptypes), ptypes.length, m));
646 | }
647 | }
648 | if (cls.getFields() != null) {
649 | for (Field f: cls.getFields()) {
650 | mapListAdd(map, f.getName(), new MemberInfo(null, -1, f));
651 | }
652 | }
653 | }
654 | return mapMapGet(mapClassMembers, cls, name, null);
655 | }
656 |
657 | private static class MemberInfo {
658 | String signature; // null for field
659 | int numArgs; // -1 for field
660 | Member member;
661 | MemberInfo(String sign, int num, Member member) {
662 | signature = sign;
663 | numArgs = num;
664 | this.member = member;
665 | }
666 | }
667 |
668 | }
669 |
--------------------------------------------------------------------------------