2009年9月6日 星期日

動態Spinner來變更Image

所需功能
  1. 取得res/drawable資料夾下的所有檔案名稱
  2. 由檔案名稱取得ResourceID
  3. 點選並顯示圖檔
package java2.tw;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;

public class mySpinner extends Activity {

private Spinner mySpinner;
private ImageView myImageView;
private ArrayAdapter myArrayAdapter;
static String[] myResource;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mySpinner = (Spinner) findViewById(R.id.mySpinner);
myImageView = (ImageView) findViewById(R.id.myImageView);
getResourceName();
myArrayAdapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, myResource);
mySpinner.setAdapter(myArrayAdapter);

mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView arg0, View arg1,
int arg2, long arg3) {
myImageView.setImageResource(getResourceIDByName(
R.drawable.class, myResource[arg2]));

}

@Override
public void onNothingSelected(AdapterView arg0) {
}
});
}

private void getResourceName() {
String[] resource;
List list = new ArrayList();
for (Field f : R.drawable.class.getDeclaredFields()) {
try {
list.add(f.getName());
} catch (Exception e) {
Toast.makeText(this, "圖片目錄載入失敗", Toast.LENGTH_SHORT).show();
}
}
resource = new String[list.size()];
for (int i = 0; i <>
resource[i] = list.get(i);
}
myResource = resource;
}

private int getResourceIDByName(Class aClass, String resourceName) {
Field[] drawableFields = aClass.getFields();
int resourceID = 0;
for (Field f : drawableFields) {
if (resourceName.equals(f.getName())) {
try {
resourceID = f.getInt(null);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return resourceID;
}
}

在Android程式中取得圖檔方法

單一圖檔:

方法一:
Field f= (Field)R.drawable.class.getDeclaredField("dsc00002");
int imageID =f.getInt(R.drawable.class);
ImageView imageView= new ImageView(this);
imageView.setImageResource(imageID);

public Field getDeclaredField (String name)

Returns a Field object for the field with the specified name which is declared in the class represente by this Class.

Parameters
name the name of the requested field.
Returns
  • the requested field in the class represented by this class.

方法二:

int imageID =this.getResources().getIdentifier(this.getPackageName()+":drawable/dsc00002", null,null);

//int imageID = this.getResources().getIdentifier("dsc00002", "drawable", this.getPackageName());

ImageView imageview = new ImageView(this);
imageview.setImageResource(imageID);

public int getIdentifier (String name, String defType, String defPackage)

Return a resource identifier for the given resource name. A fully qualified resource name is of the form "package:type/entry". The first two components (package and type) are optional if defType and defPackage, respectively, are specified here.

Note: use of this function is discouraged. It is much more efficient to retrieve resources by identifier than by name.

Parameters
name The name of the desired resource.
defType Optional default resource type to find, if "type/" is not included in the name. Can be null to require an explicit type.
defPackage Optional default package to find, if "package:" is not included in the name. Can be null to require an explicit package.
Returns
  • int The associated resource identifier. Returns 0 if no such resource was found. (0 is not a valid resource ID.)

批次圖檔:

public int[] getImageID() {

int[] output;

List list = new ArrayList();

for (Field f : R.drawable.class.getDeclaredFields()) {

try {

Object object = f.get(R.drawable.class);

if (object instanceof Integer) {

list.add((Integer) object);

}

} catch (Exception e) {

Toast.makeText(myContext, "圖片載入失敗", Toast.LENGTH_SHORT).show();

}

}

output = new int[list.size()];

for (int i = 0; i <>

output[i] = list.get(i).intValue();

}

return output;

}