65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Python 编写 Android GUI(7:Activity)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (7投票s)

2012年6月17日

CPOL

3分钟阅读

viewsIcon

58360

downloadIcon

1410

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 文件布局。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 的代码

Activity 的引导代码是用 Java 编写的,这很简单。它的功能是加载 Python 代码,该代码是位于 asset 目录中的 code.py。
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

“Code.py” 是根 Activity 的主要代码。它是一个 Python 文件。 步骤 1:Python 代码的第一步是获取由 Java 代码创建的服务组对象和服务对象。
SrvGroup = libstarpy._GetSrvGroup()
Service = SrvGroup._GetService("","")
#--get activity
StarActivity = Service.ActivityClass.getCurrent();
步骤 2:步骤 2 是获取在布局文件中定义的小部件。并设置按钮的 onClick 事件监听器。当事件被触发时,我们构建一个 intent 并创建子 Activity。子 Activity 被命名为 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> 
Python 代码
#--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(); 
步骤 3:当子 Activity 返回时,我们可以从子 Activity 获取结果,并在文本视图中显示它。为了接收结果,我们应该覆盖 Activity 的 onActivityResult 函数。
#--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 文件还包含文本视图、按钮和编辑视图,如下所示。
<?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 的代码

子 Activity 的引导代码与父 Activity 相同。

code.py

步骤 1
Python 代码的第一步是获取由 Java 代码创建的服务组对象和服务对象,这与父 Activity 相同。Python 使用全局命名空间,应该特别注意。如果我们使用与父 Activity 相同的变量名,它将替换父 Activity 中的变量,这可能会导致错误。
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

© . All rights reserved.