使用 Python 编写 Android GUI(7:Activity)
Android 应用程序的 Activity 是主要实体,类似于 win32 平台上的窗口。它具有生命周期,包含 GUI 小部件,并将它们一起管理。Activity 可以创建子 Activity,并带有初始参数,并从它们获取结果。这里给出一个操作 Activity 的例子,其代码
介绍
Android 应用程序的 Activity 是主要实体,类似于 win32 平台上的窗口。它具有生命周期,包含 GUI 小部件,并将它们一起管理。Activity 可以创建子 Activity,并带有初始参数,并从它们获取结果。这里给出一个操作 Activity 的例子,其代码是用基于 wrapandroid 项目的 Python 编写的。本文的目的是告诉程序员如何使用 Python 操作 Activity,而不是解释 Activity 的生命周期以及如何创建子 Activity,这些内容在 Android SDK 文档中已详细讨论。
本文中给出的示例很简单。我们创建两个 Activity,一个是根 Activity,另一个是子 Activity。根 Activity 包含一个编辑小部件,用于从用户那里获取输入,以及一个按钮小部件。当用户按下按钮时,将创建子 Activity,并将输入作为参数传递给它。子 Activity 在文本小部件中显示该参数,并显示一个编辑小部件,供用户输入父 Activity 的结果。最后,从子 Activity 返回的文本将显示在父 Activity 中。
根 Activity
布局 XML 文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/widget30"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<LinearLayout
android:id="@+id/widget34"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="bottom"
android:layout_gravity="center_vertical"
>
<TextView
android:id="@+id/widget35"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="input text :"
>
</TextView>
<EditText
android:id="@+id/widget38"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="hello"
android:textSize="18sp"
>
</EditText>
</LinearLayout>
<Button
android:id="@+id/widget39"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="send to child"
>
</Button>
<LinearLayout
android:id="@+id/widget40"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="bottom"
android:layout_gravity="center_vertical"
>
<TextView
android:id="@+id/widget41"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="result from child :"
>
</TextView>
<TextView
android:id="@+id/widget42"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:textSize="18sp"
>
</TextView>
</LinearLayout>
</LinearLayout>
Activity 的代码
public class ActivityActivity extends WrapAndroidActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
StarActivity._Call("DoAssetsFile", "python", "code.py");
}
}
code.py
SrvGroup = libstarpy._GetSrvGroup()
Service = SrvGroup._GetService("","")
#--get activity
StarActivity = Service.ActivityClass.getCurrent();
ChildActivity
。它必须在 AndroidManifest.xml 中声明。否则,调用将失败。AndroidManifest.xml <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".ActivityActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ChildActivity" android:label="@string/app_name"/>
</application>
#--button
myEdit = StarActivity.findViewById("EditTextClass",StarActivity.getResource("id/widget38"));
myButton = StarActivity.findViewById("ButtonClass",StarActivity.getResource("id/widget39"));
def myButton_onClick(self, Ev) :
MyIntent = Service.IntentClass._New();
MyIntent.setClassName("ChildActivity");
MyIntent.putStringExtra("value",myEdit.getText());
StarActivity.startActivityForResult(MyIntent,1);
MyIntent._Free();
return;
myButton.onClick = myButton_onClick;
myButton.setOnClickListener();
#--receive result
myText = StarActivity.findViewById("EditTextClass",StarActivity.getResource("id/widget42"));
myText.setTextColor(0xFFFF0000)
def StarActivity_onActivityResult(self,requestCode, resultCode, data) :
if( requestCode == 1 and data != None ) :
myText.setText(data.getStringExtra("value"))
StarActivity.onActivityResult = StarActivity_onActivityResult;
子 Activity
布局 XML 文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/widget30"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<LinearLayout
android:id="@+id/widget31"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/widget32"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="from parent :"
>
</TextView>
<TextView
android:id="@+id/widget33"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
>
</TextView>
</LinearLayout>
<LinearLayout
android:id="@+id/widget34"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/widget35"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="input text : "
>
</TextView>
<EditText
android:id="@+id/widget36"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText"
android:textSize="18sp"
>
</EditText>
</LinearLayout>
<Button
android:id="@+id/widget37"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="return to parent"
>
</Button>
</LinearLayout>
子 Activity 的代码
code.py
SrvGroup = libstarpy._GetSrvGroup()
Service = SrvGroup._GetService("","")
//#--get activity, global python name space
ChildStarActivity = Service.ActivityClass.getCurrent();
首先,我们获取启动 intent,该 intent 由父 Activity 设置。然后,获取在布局文件中定义的文本视图,并在文本视图中显示 intent 的字符串。获取按钮小部件,设置其 onClick 事件监听器。当事件被触发时,我们为父 Activity 构建结果 intent,并调用 finish 函数来结束子 Activity。
//#--get intent which is created by parent
child_intent = ChildStarActivity.getIntent();
//#--get text view widget defined in layout
ChildText = ChildStarActivity.findViewById("TextViewClass",ChildStarActivity.getResource("id/widget33"));
//#--set value of intent to text view
ChildText.setText(child_intent.getStringExtra("value"))
//#--set text color
ChildText.setTextColor(0xFFFF0000)
//#--get EditText widgt
childEdit = ChildStarActivity.findViewById("EditTextClass",ChildStarActivity.getResource("id/widget36"));
//#--get Buttn defined in layout
childButton = ChildStarActivity.findViewById("ButtonClass",ChildStarActivity.getResource("id/widget37"));
//#--set onClick event listener
def childButton_onClick(self, Ev) :
//#--create a new intent
MyIntent = Service.IntentClass._New();
//#--set string value of edit to intent
MyIntent.putStringExtra("value",childEdit.getText());
//#--set intent as result of activity
ChildStarActivity.setResult1(0,MyIntent);
MyIntent._Free();
//#--end the activity
ChildStarActivity.finish();
return;
childButton.onClick = childButton_onClick;
childButton.setOnClickListener();
我们还应该捕获 “BACK” 键事件。当按下该键时,我们也结束 Activity。
def ChildStarActivity_onKeyDown(self,keyCode,event) :
if( keyCode == Service.AndroidConstantClass.getInt("KeyEvent","KEYCODE_BACK") ) :
//# create an intent object
MyIntent = Service.IntentClass._New();
//# set string value of intent object
MyIntent.putStringExtra("value","press key back");
//# set the intent as the result of child activity
ChildStarActivity.setResult1(0,MyIntent);
MyIntent._Free();
//# call "finish" to end the activity
ChildStarActivity.finish();
return True,True;
ChildStarActivity.onKeyDown = ChildStarActivity_onKeyDown
屏幕截图
父 Activity
子 Activity