65.9K
CodeProject is changing. Read more.
Home

Writing Android GUI using Python (List view and Custom view)

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0 vote)

Apr 26, 2012

CPOL
viewsIcon

16441

Writing Android GUI using Python (list view and custom view)

Introduction

The examples in this article will create a listview and a custom view. Android listview often uses adapter such as "ArrayAdapter<String>(…)". The syntax is Java generic, which may have no corresponding types in dynamic script languages, such as Python, Lua, etc. Therefore, we have to give specific class, such as StringArrayAdaper, for it can be used in these dynamic languages. For StringArrayAdapter, we can override function getView to return little more complex view for listview. For custom view, we can create instance of View, and override its function onDraw. In function onDraw, we may draw text or bitmaps using function of canvas.

List View

We first create an instance of StringArrayAdapterClass, which is defined wrapandroid.jar package. And then create a list view.

Create StringArrayAdapter and Override Its Function getView

//#create instance of StringArrayAdapterClass
MyStringArrayAdapter = Service.StringArrayAdapterClass._New();
//#override function getView
def MyStringArrayAdapter_getView(self,position, convertView, parent) :
    global Service;
    
    //#create linearlayout
    i = Service.LinearLayoutClass._New();
    px = i.dp2px(5);
    //#set padding
    i.setPadding(px,px,px,px);
    //#set layout parameters, here we should uses function "setAbsListViewLayoutParams"
    i.setAbsListViewLayoutParams(Service.WRAP_CONTENT,Service.WRAP_CONTENT);
    //#create an imageview
    imageView = Service.ImageViewClass._New(i);
    //#set padding
    imageView.setPadding(5,5,5,5);
    //#set layout parameters. Because imageView is child of LinearLayout, 
    //we should use function "setLinearLayoutParams".
    imageView.setLinearLayoutParams(i.dp2px(24),i.dp2px(24));
    //#create TextView
    itextview = Service.TextViewClass._New(i);
    //#set layout parameter
    itextview.setLinearLayoutParams(Service.WRAP_CONTENT,Service.WRAP_CONTENT);
    //#set size of font.
    itextview.setTextSize(i.sp2px(18))
    //#set content of textview and imageview based on position
    if( position == 0 ) :
        itextview.setText("Android");
        imageView.setImageResource(StarActivity.getResource("drawable/android_logo"));
    if( position == 1 ) :
        itextview.setText("WindowsMobile");
        imageView.setImageResource(StarActivity.getResource("drawable/windowsmobile_logo"));
    if( position == 2 ) :
        itextview.setText("iOS");
        imageView.setImageResource(StarActivity.getResource("drawable/ios_logo"));
    if( position == 3 ) :
        itextview.setText("Blackberry");
        imageView.setImageResource(StarActivity.getResource("drawable/blackberry_logo"));
    //#call _LockGC function before function returns to prevent the object GC by python.
    i._LockGC();
    return i;
MyStringArrayAdapter.getView = MyStringArrayAdapter_getView;    

#add string values to StringArrayAdapter.
MyStringArrayAdapter.add("Android");
MyStringArrayAdapter.add("WindowsMobile");
MyStringArrayAdapter.add("iOS");
MyStringArrayAdapter.add("Blackberry");

Create ListView and Set Its Adapter

//#create ListView
MyListView = Service.ListViewClass._New(MyLayout);
//#set its onItemClick event listener.
def MyListView_onItemClick(self, Ev,objid,position,id) :
    Service.ToastClass._New().makeText("[MyListView] event on click is onItemClick "+objid,0).show();
MyListView.onItemClick = MyListView_onItemClick;    
//#set layout prameter
MyListView.setLinearLayoutParams(Service.FILL_PARENT,150);
//#set adapter
MyListView.setAdapter(MyStringArrayAdapter);

Custom View

For custom view, we can create instance of View, and override its function onDraw. In function onDraw, we may draw text or bitmaps using function of canvas.

Create a Paint and BitmapFactory for Using in Next Step

MyPaint = Service.PaintClass._New();  
MyBitmapFactory = Service.BitmapFactoryClass._New();

Create View and Override Its Function onDraw

def myView_onDraw(self,canvas) :
    global MyBitmapFactory,MyPaint
    
    //#call parent onDraw function
    self.onSuperDraw(canvas);    
    //#set color of Paint   
    MyPaint.setColor(0xFFFF0000);   
    //#draw a rect on canvas
    canvas.drawRect(10, 20, 100, 100, MyPaint); 
        
    //#get bitmap from resources.            
    MyBitmap = MyBitmapFactory.decodeResource
    (StarActivity.getResource("drawable/aqua02"));
    //#draw the bitmap on canvas
    canvas.drawBitmap(MyBitmap, 100, 100, None);                
    
    //#create an matrix object            
    matrix=Service.MatrixClass._New();
    //#set rotation parameter of matrix
    matrix.postScale(0.8, 0.8);
    matrix.postRotate(45);
    //create a new bitmap and set to the result of previous bitmap with matris
    dstbmp=Service.BitmapClass._New();
    dstbmp.createBitmap0
    (MyBitmap,0,0,MyBitmap.getWidth(),MyBitmap.getHeight(),matrix,True);
    //#draw the bitmap
    canvas.drawBitmap(dstbmp, 300, 100, None);
    
    //#free object created locally
    matrix._Free();
    dstbmp._Free();
    MyBitmap._Free();
myView.onDraw = myView_onDraw;    
//#set layout parameter.
myView.setLinearLayoutParams(Service.FILL_PARENT,Service.FILL_PARENT);

Screenshot