そこで、今日は Android で Parcelling を試してみようと思い、すぐにこれをモックアップしました。
public class Unit implements Parcelable {
private String unitName;
private int view;
private Double value;
/**
* Constructor
*/
public Unit() { }
/**
* Constructor
* @param unitName
*/
public Unit(String unitName) {
this.unitName = unitName;
}
/**
* Constructor
* @param unitName
* @param view
*/
public Unit(String unitName, int view, Double value) {
this.unitName = unitName;
this.view = view;
this.value = value;
}
/**
* Set the name of the unit of measurement
* @param name
*/
public void setUnitName(String name) {
this.unitName = name;
}
/**
* Set whether the unit of measurement is viewable
* @param view
*/
public void setView(int view) {
this.view = view;
}
/**
* Set the value of the unit
* @param value
*/
public void setValue(Double value) { this.value = value; }
/**
* Return the unit name
* @return unitName
*/
public String getUnitName() {
return unitName;
}
/**
* Return whether the unit is viewable
* @return view
*/
public int getView() {
return view;
}
/**
* Return the value of this unit
* @return value
*/
public Double getValue() { return value; }
/**
* Methods for parcelling here
*/
/**
* Constructor for parcelling
* @param in
*/
public Unit(Parcel in) {
//
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeList(new ArrayList<Unit>() {
//huh?
});
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public Unit createFromParcel(Parcel in) {
return new Unit(in);
}
public Unit[] newArray(int size) {
return new Unit[size];
}
};
}
Parcelableインターフェイスからオーバーライドしたメソッドの実装が不完全であることにお気付きでしょう。しかし、続けて、このクラスは別のクラスに分割可能であるはずの単なるオブジェクトです。
ここに私の主な活動があります:
public class MyActivity extends Activity {
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button send = (Button) findViewById(R.id.sendParcel);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ArrayList<Unit> units = getUnits();
Intent i = new Intent(getApplicationContext(), UnitListActivity.class);
i.putParcelableArrayListExtra("units", units);
startActivity(i);
}
});
}
/**
* Return an arraylist of units
* @return units
*/
public ArrayList<Unit> getUnits() {
ArrayList<Unit> units = new ArrayList<Unit>();
units.add(new Unit("acceleration", 1, 56.45));
units.add(new Unit("kilograms", 0, 5830.54345));
units.add(new Unit("metres", 1, 543.54));
units.add(new Unit("kilometres", 1, 32.43));
units.add(new Unit("grams", 1, 453.654));
units.add(new Unit("kilograms", 0, 8.5));
units.add(new Unit("litres", 1, 344.3));
units.add(new Unit("millilitres", 0, 4543.879));
units.add(new Unit("decimeter", 1, 5084903.564567));
return units;
}
}
基本的に、ボタンが押されたときに が作成され、インターフェースを実装するオブジェクトでIntentをパーセルしようとするボタンがあります。それを渡そうとしているクラスは、ここにあるコードです:ArrayListParcelableListActivity
public class UnitListActivity extends ListActivity {
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
UnitListAdapter mTypeAdapter = new UnitListAdapter(getApplicationContext(), bundle.getParcelableArrayList("units"));
setListAdapter(mTypeAdapter);
}
}
ここでこのアダプターを作成しましListActivityた:
public class UnitListAdapter extends ArrayAdapter<Unit> {
private ArrayList<Unit> unitsList;
private Context context;
public UnitListAdapter(Context c, ArrayList<Unit> units) {
super(c, R.layout.unit_values, units);
this.context = c;
this.unitsList = units;
}
@Override
public View getView(int position, View convertView, ViewGroup parentView) {
View view = null;
LayoutInflater inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflator.inflate(R.layout.unit_values, null);
TextView textView = (TextView) view.findViewById(R.id.unit_name);
CheckBox checkBox = (CheckBox) view.findViewById(R.id.check);
//check box set on check changed listener if I get this far for later
if(unitsList.get(position).getView() == 1) {
textView.setText(unitsList.get(position).getUnitName());
checkBox.setChecked(true);
} else {
textView.setText(unitsList.get(position).getUnitName());
}
return view;
}
}
今、私が理解していないのは、ListActivityこの行の理由です:
クラスがそれらを実装しているためUnitListAdapter mTypeAdapter = new UnitListAdapter(getApplicationContext(), bundle.getParcelableArrayList("units"));、 Unit オブジェクトを取得する代わりに、オブジェクトを取得していると不平を言っています。ParcelableUnit
これは、アダプターで Parcelable オブジェクトを期待するようにリストを変更する必要があるということですか?
私も理解できませんwriteToParcel。ドキュメントにはオブジェクトをフラット化すると書かれているので、リストをフラット化したいのでwriteListメソッドが必要になると思いましたが、その後はどうなりますか? リストではなく Unit オブジェクトをフラット化しているようです。
これにより、コンストラクターについて質問することにもなります。
public Unit(Parcel in) {
//
}
私は次のようなことをする必要があると推測しています:
readTypedList()- 区画を作成するので、なぜこれをしなければならないのかわかりません。したがって、このことを実装する方法がわかりません...パーセリングがどのように機能しているかについての洞察が本当に欲しいのですが、役立つドキュメントが見つかりませんでした。この例ではそれがどのようにうまく機能するか. ヘルプとアドバイスは大歓迎です。