zoukankan      html  css  js  c++  java
  • 用python开发android应用(1)

         Python是动态语言,比较简洁。Android不直接支持使用python开发应用,需要使用其它中间件或者库。PythonForAndroid提供了在android平台上对python语言的支持;CLE支持python和java之间的交互,同时提供了一个通用的接口,可用于其它多种语言。Wrapandroid project将android类封装为CLE对象,从而可以使多种语言可以调用android类。使用这三个组件,可以在android平台上直接使用python开发界面应用程序。Wrapandroid项目在进行中,目前的0.8.5版本已经提供了除SQlite,OpenGL之外大部分android类的封装。完全可以编写一个独立的python应用程序。


     在android上开发python应用程序,编程和打包环境可以直接使用eclipse。

    1. 准备环境

    a: 安装PythonForAndroid: http://code.google.com/p/android-scripting
    b: CLE在程序运行的时候,自动从网络上安装,也可以下载库函数,放到工程中。开发需要java库文件starcore_android_r6.jar。文件在starcore_devfiles_r6.zip中,可以从http://code.google.com/p/cle-for-android下载
    c: Wrapandroid项目库文件wrapandroid.jar,包含在压缩包http:/code.google.com/p/wrapandroid-for-multilaguage/download/wrapandroid_devfiles_0_8_6.rar中。

    2. 开始编程

    a. 打开eclipse, 创建一个新的android project “introduction”
    b. 如果要从网络安装,则需要添加许可权限: 
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    c. 将库文件starcore_android_r6.jar和wrapandroid.jar到工程目录下,将这两个文件加入到工程中,如下图:

    d. 编辑 IntroductionActivity.java,如下修改,加载python代码

    import com.srplab.wrapandroid.*;

    public class IntroductionActivity 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");
        }
    }

    如果不希望从网络安装CLE,可以将CLE的共享库文件包含在工程中,如下:

     

    同时在activity中设置下载标志为false

    public class IntroductionActivity extends WrapAndroidActivity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
         DownloadFromNetFlag = false;
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            StarActivity._Call("DoAssetsFile", "python", "code.py");
        }
    }

    只不过此时生成的安装包大一些。

    e. 编辑layout:main.xml.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="
    http://schemas.android.com/apk/res/android"
        android:id="@+id/widget73"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/widget45"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello" /> 
        <Button
            android:id="@+id/widget74"
            android:layout_width="220dp"
            android:layout_height="48dp"
            android:text="thank for your use"
            android:typeface="serif"
            android:textStyle="bold"
            android:textColor="#ffff0000"
            android:layout_x="284dp"
            android:layout_y="220dp"
            android:textSize="16dp"
        />        
    </LinearLayout>

    f. 在assets目录下,创建code.py文件.

    3. code.py代码如下

    a. 获取当前服务


    SrvGroup = libstarpy._GetSrvGroup()
    Service = SrvGroup._GetService("","")

    b. 获取当前的Activity


    StarActivity = Service.ActivityClass.getCurrent();

    c. 获取layout中定义的对象


    MyText = StarActivity.findViewById("TextViewClass",StarActivity.getResource("id/widget45"));
    findViewById函数与标准的android函数有差异,主要是输入参数中增加了类的名称;类名称为android类名称,加上”Class”后缀。
    MyText.setText("from layout");

    MyButton = StarActivity.findViewById("ButtonClass",StarActivity.getResource("id/widget74"));
    定义button对象的点击事件
    def MyButton_onClick(self, Ev) :
        Service.ToastClass._New().makeText("Button is click", 0).show();
    MyButton.onClick = MyButton_onClick;    
    MyButton.setOnClickListener();
    setOnClickListener与android函数有差异,不需要输入listener,事件触发之后产生给本队象。

    d. 动态创建对象

     

    获取LinearLayout布局
    MyLinearLayout = StarActivity.findViewById("LinearLayoutClass",StarActivity.getResource("id/widget73"));

    创建一个动态的按钮
    MyDynaButton = Service.ButtonClass._New(MyLinearLayout);
    def MyDynaButton_onClick(self, Ev) :
        Service.ToastClass._New().makeText("Button is click", 0).show();
    MyDynaButton.onClick = MyDynaButton_onClick;
    MyDynaButton.setOnClickListener();
    MyDynaButton.setText("created dynamically");
    设置按钮的布局参数
    MyDynaButton.setLinearLayoutParams(100,50);


    运行结果如下:

     

    例子下载:

    http://wrapandroid-for-multilanguage.googlecode.com/svn/wiki/examples/pythongui85_introduction.rar


  • 相关阅读:
    盒子垂直水平居中
    Sahi (2) —— https/SSL配置(102 Tutorial)
    Sahi (1) —— 快速入门(101 Tutorial)
    组织分析(1)——介绍
    Java Servlet (1) —— Filter过滤请求与响应
    CAS (8) —— Mac下配置CAS到JBoss EAP 6.4(6.x)的Standalone模式(服务端)
    JBoss Wildfly (1) —— 7.2.0.Final编译
    CAS (7) —— Mac下配置CAS 4.x的JPATicketRegistry(服务端)
    CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解
    CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
  • 原文地址:https://www.cnblogs.com/jackrex/p/3001210.html
Copyright © 2011-2022 走看看