2011年6月7日星期二

Android 開發工具 ADT 11 已供下載,改進編輯功能

ADT 11 重點改進編輯器。
  • 首先,它提供了一些新的視覺重構操作,如"Extract Include'和"Extract Style". 這有助於自動提取片段重複佈局和樣式屬性為可重複使用的佈局,樣式和主題。
  • 第二,可視化佈局編輯器現在支持的片段,調色板配置,更好地支持自定義視圖。
  • 最後,已經改良XML編輯,更多文件類型的代碼完成(code completion)和增強許多"轉至聲明"(go to declaration)。


來源:
- Android開發者博客: New Editing Features in Eclipse plug-in for Android



2011年5月31日星期二

動態修改列表視圖(ListView)的內容

修改前文"動態刪除列表視圖(ListView)的內容"的程序代碼, 在對話框(delAlertDialog)新增修改選項, 再建立另一個包含編輯文本視圖 (EditText) 的對話框(editDialog). 完成後, 通過 MyArrayAdapter.remove() 和 MyArrayAdapter.insert() 修改列表視圖(ListView)的內容.

動態修改列表視圖(ListView)的內容

package com.AndroidDynList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class AndroidDynList extends Activity {

EditText input;
Button add, clear;
ListView listview;
ArrayAdapter<String> MyArrayAdapter;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
input = (EditText)findViewById(R.id.input);
add = (Button)findViewById(R.id.add);
clear = (Button)findViewById(R.id.clear);
listview = (ListView)findViewById(R.id.list);

MyArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
listview.setAdapter(MyArrayAdapter);

add.setOnClickListener(addOnClickListener);
clear.setOnClickListener(clearOnClickListener);

listview.setOnItemClickListener(listViewOnItemClickListener);
}

private Button.OnClickListener addOnClickListener
= new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String newInput = input.getText().toString();
MyArrayAdapter.add(newInput);
MyArrayAdapter.notifyDataSetChanged();
}};

private Button.OnClickListener clearOnClickListener
= new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
MyArrayAdapter.clear();
MyArrayAdapter.notifyDataSetChanged();
}};

private ListView.OnItemClickListener listViewOnItemClickListener
= new ListView.OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> parent, View view, final int position,
long id) {
// TODO Auto-generated method stub
final String strSelectedItem = parent.getItemAtPosition(position).toString();

AlertDialog.Builder delAlertDialog = new AlertDialog.Builder(AndroidDynList.this);
delAlertDialog.setTitle("- DELETE/Edit Selected Item? -");
delAlertDialog.setMessage(strSelectedItem);
delAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
MyArrayAdapter.remove(strSelectedItem);
MyArrayAdapter.notifyDataSetChanged();
}
});
delAlertDialog.setNeutralButton("Edit", new DialogInterface.OnClickListener() {

// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
AlertDialog.Builder editDialog = new AlertDialog.Builder(AndroidDynList.this);
editDialog.setTitle("--- Edit ---");

final EditText editText = new EditText(AndroidDynList.this);
editText.setText(strSelectedItem);
editDialog.setView(editText);

editDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
MyArrayAdapter.remove(strSelectedItem);
MyArrayAdapter.insert(editText.getText().toString(), position);
}});
editDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
//...
}
});
editDialog.show();
}
});
delAlertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
//...
}
});
delAlertDialog.show();
}};
}


2011年5月29日星期日

利用 AlertDialog.Builder 創建包含編輯文本視圖 (EditText) 的對話框

包含編輯文本視圖 (EditText) 的對話框


package com.AndroidEditDialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AndroidEditDialog extends Activity {

Button btnEdit;
TextView textOut;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnEdit = (Button)findViewById(R.id.edit);
textOut = (TextView)findViewById(R.id.textout);

btnEdit.setOnClickListener(btnEditOnClickListener);
}

private Button.OnClickListener btnEditOnClickListener
= new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub

AlertDialog.Builder editDialog = new AlertDialog.Builder(AndroidEditDialog.this);
editDialog.setTitle("--- Edit ---");

final EditText editText = new EditText(AndroidEditDialog.this);
editText.setText(textOut.getText());
editDialog.setView(editText);

editDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
textOut.setText(editText.getText().toString());
}
});
editDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
//...
}
});
editDialog.show();

}};
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Edit"
/>
<TextView
android:id="@+id/textout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="You can change it"
/>
</LinearLayout>

2011年5月28日星期六

動態刪除列表視圖(ListView)的內容

跟進前一文"動態添加列表視圖(ListView)的內容"的帖子, 新增刪除的功能.

創建列表視圖(ListView)的 OnItemClickListener(), 當用戶點擊列表視圖的一個項目, 然後打開一個對話框, 如果用戶點擊"OK", 此一項目將被刪除.

動態刪除列表視圖(ListView)的內容

佈局文件(main.xml)無需修改, 參閱前文"動態添加列表視圖(ListView)的內容".

修改主要代碼 AndroidDynList.java, 添加 listViewOnItemClickListener.
package com.AndroidDynList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class AndroidDynList extends Activity {

EditText input;
Button add, clear;
ListView listview;
ArrayAdapter<String> MyArrayAdapter;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
input = (EditText)findViewById(R.id.input);
add = (Button)findViewById(R.id.add);
clear = (Button)findViewById(R.id.clear);
listview = (ListView)findViewById(R.id.list);

MyArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
listview.setAdapter(MyArrayAdapter);

add.setOnClickListener(addOnClickListener);
clear.setOnClickListener(clearOnClickListener);

listview.setOnItemClickListener(listViewOnItemClickListener);
}

private Button.OnClickListener addOnClickListener
= new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String newInput = input.getText().toString();
MyArrayAdapter.add(newInput);
MyArrayAdapter.notifyDataSetChanged();
}};

private Button.OnClickListener clearOnClickListener
= new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
MyArrayAdapter.clear();
MyArrayAdapter.notifyDataSetChanged();
}};

private ListView.OnItemClickListener listViewOnItemClickListener
= new ListView.OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
final String strSelectedItem = parent.getItemAtPosition(position).toString();

AlertDialog.Builder delAlertDialog = new AlertDialog.Builder(AndroidDynList.this);
delAlertDialog.setTitle("- DELETE Selected Item? -");
delAlertDialog.setMessage(strSelectedItem);
delAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
MyArrayAdapter.remove(strSelectedItem);
MyArrayAdapter.notifyDataSetChanged();
}
});
delAlertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
//...
}
});
delAlertDialog.show();
}};
}


相關文章:
- 動態修改列表視圖(ListView)的內容

動態添加列表視圖(ListView)的內容

本範例先創建一個空的陣列適配器(ArrayAdapter), 它是一個列表視圖(ListView)的適配器(Adapter). 然後動態添加它的內容.

動態添加列表視圖(ListView)的內容

package com.AndroidDynList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class AndroidDynList extends Activity {

EditText input;
Button add, clear;
ListView listview;
ArrayAdapter<String> MyArrayAdapter;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
input = (EditText)findViewById(R.id.input);
add = (Button)findViewById(R.id.add);
clear = (Button)findViewById(R.id.clear);
listview = (ListView)findViewById(R.id.list);

MyArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
listview.setAdapter(MyArrayAdapter);

add.setOnClickListener(addOnClickListener);
clear.setOnClickListener(clearOnClickListener);
}

private Button.OnClickListener addOnClickListener
= new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String newInput = input.getText().toString();
MyArrayAdapter.add(newInput);
MyArrayAdapter.notifyDataSetChanged();
}};

private Button.OnClickListener clearOnClickListener
= new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
MyArrayAdapter.clear();
MyArrayAdapter.notifyDataSetChanged();
}};
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<EditText
android:id="@+id/input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/add"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Add"
/>
<Button
android:id="@+id/clear"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Clear"
/>
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>


相關文章:
- 動態刪除列表視圖(ListView)的內容

2011年5月26日星期四

2011年5月23日星期一

創建自定義的 GLSurfaceView,以處理用戶輸入

把前面的"GLSurfaceView 示例"修改, 創建自定義的GLSurfaceView,並實現onTouchEvent()函數, 便可以處理用戶輸入.

本例子中, 用戶在屏幕上移動手指, 畫面顏色會根據而改變.

AndroidGLSurfaceViewActivity.java
package com.AndroidGLSurfaceViewActivity;

import android.app.Activity;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.MotionEvent;

public class AndroidGLSurfaceViewActivity extends Activity {

private MyGLSurfaceView myGLSurfaceView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create our Preview view and set it as the content of our
// Activity
myGLSurfaceView = new MyGLSurfaceView(this);
setContentView(myGLSurfaceView);
}

@Override
protected void onResume() {

super.onResume();
myGLSurfaceView.onResume();
}

@Override
protected void onPause() {

super.onPause();
myGLSurfaceView.onPause();
}

class MyGLSurfaceView extends GLSurfaceView{

MyRenderer myRenderer;

public MyGLSurfaceView(Context context) {
super(context);
// TODO Auto-generated constructor stub
myRenderer = new MyRenderer();
setRenderer(myRenderer);
}

@Override
public boolean onTouchEvent(final MotionEvent event) {
// TODO Auto-generated method stub
queueEvent(new Runnable(){

public void run() {
myRenderer.setColor(event.getX()/getWidth(),
event.getY()/getHeight(), 1.0f);
}});
return true;
}
}

}


MyRenderer.java
package com.AndroidGLSurfaceViewActivity;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

public class MyRenderer implements android.opengl.GLSurfaceView.Renderer{

private float red = 0;
private float green = 0;
private float blue = 0;

@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
gl.glClearColor(red, green, blue, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}

@Override
public void onSurfaceChanged(GL10 arg0, int arg1, int arg2) {
// TODO Auto-generated method stub

}

@Override
public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
// TODO Auto-generated method stub

}

public void setColor(float r, float g, float b){
red = r;
green = g;
blue = b;
}

}