S
Sabey
Neues Mitglied
- 0
Hallo zusammen,
ich arbeite gerade an einer App die Rezepte mit einem Bild, dem Namen und der Kategorie in einem ListView anzeigen soll.
Über eine zweite Activity kann man die entsprechenden Daten eingeben und ein Bild machen. Diese Daten sollen dann per Intent an meine Main Activity übergeben und dort angezeigt werden. Beziehungsweise werden die Daten dort in eine Datenbank gespeichert und von dort raus gezogen und angezeigt.
Den Namen und die Kategorie zeigt es für jeden Eintrag richtig an. Allerdings weiß ich nicht wie ich das jeweilige Bild im ListView anzeigen lassen kann. Beziehungsweise wenn kein Bild gemacht wurde, ein Platzhalterbild anzeigen lasse. Dieses ist bereits in meinem Layout vorhanden, soll also nur gegebenenfalls mit einem selbst gemachten Bild überschrieben werden. Momentan stürzt die App ab, wenn ich kein eigenes Bild schieße.
Hier meine Main Activity:
Meine Activity in der das Bild gemacht wird:
ich arbeite gerade an einer App die Rezepte mit einem Bild, dem Namen und der Kategorie in einem ListView anzeigen soll.
Über eine zweite Activity kann man die entsprechenden Daten eingeben und ein Bild machen. Diese Daten sollen dann per Intent an meine Main Activity übergeben und dort angezeigt werden. Beziehungsweise werden die Daten dort in eine Datenbank gespeichert und von dort raus gezogen und angezeigt.
Den Namen und die Kategorie zeigt es für jeden Eintrag richtig an. Allerdings weiß ich nicht wie ich das jeweilige Bild im ListView anzeigen lassen kann. Beziehungsweise wenn kein Bild gemacht wurde, ein Platzhalterbild anzeigen lasse. Dieses ist bereits in meinem Layout vorhanden, soll also nur gegebenenfalls mit einem selbst gemachten Bild überschrieben werden. Momentan stürzt die App ab, wenn ich kein eigenes Bild schieße.
Hier meine Main Activity:
Code:
private ListViewAdapter adapter;
private ArrayList<ListItem> itemList;
private ListView list;
private DatabaseAdapter receptDB;
private SensorManager sensorMgr;
private long mLastShakeTime;
private SensorEventListener listener = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
setupListView();
setupDatabase();
setupButton();
setupSensor();
addObject();
}
private void setupDatabase() {
receptDB = new DatabaseAdapter(this);
receptDB.open();
refreshListView();
}
private void setupButton() {
Button addItemButton = (Button) findViewById(R.id.addItemButton);
addItemButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addButtonClicked();
}
});
}
private void addButtonClicked() {
sensorMgr.unregisterListener(listener);
Intent newItemIntent = new Intent(List_Page.this, Add_Object.class);
startActivity(newItemIntent);
finish();
}
private void setupListView() {
itemList = new ArrayList<ListItem>();
adapter = new ListViewAdapter(List_Page.this, itemList);
list = (ListView) findViewById(R.id.listItem);
list.setOnItemLongClickListener(longClickListener);
list.setOnItemClickListener(clickListener);
list.setAdapter(adapter);
}
private void setupSensor(){
sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor accelerometer = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if (accelerometer != null) {
sensorMgr.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
}
@Override
public void onBackPressed() {}
private void addObject(){
Intent intent = getIntent();
if (intent.hasExtra(Constants.KEY_RECEPT_NAME)) {
String name = intent.getExtras().getString(Constants.KEY_RECEPT_NAME);
String kategory = intent.getExtras().getString(Constants.KEY_KATEGORY);
String ingredients = intent.getExtras().getString(Constants.KEY_INGREDIENTS);
String directions = intent.getExtras().getString(Constants.KEY_DIRECTIONS);
byte[] imageBytes = intent.getByteArrayExtra(Constants.KEY_IMAGE);
ListItem newObject = new ListItem(name,kategory,ingredients,directions, imageBytes);
receptDB.insertReceptItem(newObject);
refreshListView();
}
}
//View updaten
//hier immer auch bild rausnehmen, wenn kein photo dann das was bereits gesetzt ist?
private void refreshListView() {
Cursor cursor = receptDB.getAllRows();
String[] fromFieldNames = new String[] {DatabaseAdapter.KEY_NAME, DatabaseAdapter.KEY_KATEGORY};
int[] toViewIDs = new int[] {R.id.receptName, R.id.kategory};
SimpleCursorAdapter myCursorAdapter;
myCursorAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.activity_list_item, cursor, fromFieldNames, toViewIDs, 0);
ListView myList = (ListView) findViewById(R.id.listItem);
myList.setAdapter(myCursorAdapter);
}
//zuvor fragen!!
private void removeTaskAtPosition(long id) {
receptDB.deleteItem(id);
refreshListView();
}
// convert from bitmap to byte array
public static byte[] getBytes(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0, stream);
return stream.toByteArray();
}
// convert from byte array to bitmap
public static Bitmap getImage(byte[] image) {
return BitmapFactory.decodeByteArray(image, 0, image.length);
}
private void alertDialogDelete(long id){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
sensorMgr.unregisterListener(listener);
final long _id = id;
builder.setMessage("Bist du dir sicher, dass du dieses Rezept löschen willst?");
builder.setPositiveButton("JA", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
removeTaskAtPosition(_id);
dialog.dismiss();
}
});
builder.setNegativeButton("NEIN", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
setupSensor();
alert.show();
}
//ondestroy stürzt schüttelsensor ab
//schummeln we
@Override
public void onSensorChanged(SensorEvent event) {
if (receptDB.getAllRows().getCount() != 0) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
if ((curTime - mLastShakeTime) > MIN_TIME_BETWEEN_SHAKES_MILLISECS) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
double acceleration = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) +
Math.pow(z, 2)) - SensorManager.GRAVITY_EARTH;
if (acceleration > SHAKE_THRESHOLD) {
alertDialogRandomRecept(curTime);
}
}
}
}
}
private void alertDialogRandomRecept(final long curTime) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Willst du ein zufälliges Rezept angezeigt bekommen?");
sensorMgr.unregisterListener(listener);
builder.setPositiveButton("JA", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mLastShakeTime = curTime;
randomRecept();
dialog.dismiss();
}
});
builder.setNegativeButton("NEIN", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
alert.show();
}
//wenn nur eins drin stürzt ab
private void randomRecept() {
Random random = new Random();
long randomLong = (long) random.nextInt(receptDB.getAllRows().getCount()) + 1;
openObject(randomLong);
}
private void openObject(long id) {
sensorMgr.unregisterListener(listener);
Intent openObject = new Intent(List_Page.this, Open_Object.class);
Cursor itemToOpen = receptDB.getRow(id);
if( itemToOpen != null && itemToOpen.moveToFirst() ) {
openObject.putExtra(Constants.KEY_RECEPT_NAME, itemToOpen.getString(1));
openObject.putExtra(Constants.KEY_KATEGORY, itemToOpen.getString(2));
openObject.putExtra(Constants.KEY_INGREDIENTS, itemToOpen.getString(3));
openObject.putExtra(Constants.KEY_DIRECTIONS, itemToOpen.getString(4));
openObject.putExtra(Constants.KEY_IMAGE, itemToOpen.getBlob(1));
startActivity(openObject);
finish();
}
itemToOpen.close();
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
private AdapterView.OnItemLongClickListener longClickListener = new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
alertDialogDelete(id);
return true;
}
};
private AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
openObject(l);
}
};
}
Meine Activity in der das Bild gemacht wird:
Code:
private EditText ingredients, directions, receptName;
String newIngredientsText, newDirectionsText , newReceptNameText, newKategoryText;
private Spinner kategory;
private Bitmap bitmap;
private Uri fileUri;
private ImageView photo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_object);
setupViews();
setupButtons();
checkIntent();
checkCameraAvailability();
}
//onClick Listeners auf die drei Buttons
private void setupButtons() {
Button addItemButton = (Button) findViewById(R.id.backButton);
addItemButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
backButtonClicked();
}
});
Button addImageButton = (Button) findViewById(R.id.addImageButton);
addImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
captureImage();
}
});
Button saveButton = (Button) findViewById(R.id.save_button);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveButtonClicked();
}
});
}
//zurück auf die List_Page springen wenn der back button geklickt ist
private void backButtonClicked() {
Intent backIntent = new Intent(Add_Object.this, List_Page.class);
startActivity(backIntent);
finish();
}
@Override
public void onBackPressed() {
super.onBackPressed();
backButtonClicked();
}
private void checkIntent() {
Intent i = getIntent();
if (i.hasExtra(Constants.KEY_RECEPT_NAME)){
receptName.setText(i.getExtras().getString(Constants.KEY_RECEPT_NAME));
//kategory.setSelection(equals(Constants.KEY_KATEGORY));
ingredients.setText(i.getExtras().getString(Constants.KEY_INGREDIENTS));
directions.setText(i.getExtras().getString(Constants.KEY_DIRECTIONS));
}
}
private void checkCameraAvailability() {
// Checking camera availability
if (!isDeviceSupportCamera()) {
Toast.makeText(getApplicationContext(),
"Sorry! Your device doesn't support camera",
Toast.LENGTH_LONG).show();
finish();
}
}
//Eingabedaten speichern wenn der speichern-Button geklickt wird
private void saveButtonClicked() {
//handle Entry
getEntries();
//check if
if(ingredients != null && ! TextUtils.isEmpty(newIngredientsText.trim()) &&
directions != null && ! TextUtils.isEmpty(newDirectionsText.trim()) &&
receptName != null && ! TextUtils.isEmpty(newReceptNameText.trim())) {
backAndSaveIntent();
//handle no input case
}else{
//create and show toast
Toast toast = Toast.makeText(this, R.string.noEntryToast, Toast.LENGTH_SHORT);
toast.show();
}
}
private void resetViews() {
directions.setText("");
ingredients.setText("");
receptName.setText("");
//photo.setImageResource(android.R.color.transparent);
}
private void backAndSaveIntent() {
Intent backAndSaveIntent = new Intent(Add_Object.this, List_Page.class);
backAndSaveIntent.putExtra(Constants.KEY_DIRECTIONS, newDirectionsText);
backAndSaveIntent.putExtra(Constants.KEY_INGREDIENTS, newIngredientsText);
backAndSaveIntent.putExtra(Constants.KEY_RECEPT_NAME, newReceptNameText);
backAndSaveIntent.putExtra(Constants.KEY_KATEGORY, newKategoryText);
backAndSaveIntent.putExtra(Constants.KEY_IMAGE, getBytes(bitmap));
resetViews();
startActivity(backAndSaveIntent);
finish();
}
// convert from bitmap to byte array
public static byte[] getBytes(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0, stream);
return stream.toByteArray();
}
private void setupViews() {
ingredients = (EditText) findViewById(R.id.enterIngredients);
directions = (EditText) findViewById(R.id.enterDirections);
receptName = (EditText) findViewById(R.id.receptName);
kategory = (Spinner) findViewById(R.id.kategory_spinner);
photo = (ImageView) findViewById(R.id.photoView);
}
public void getEntries() {
newIngredientsText = ingredients.getText().toString();
newDirectionsText = directions.getText().toString();
newReceptNameText = receptName.getText().toString();
newKategoryText = kategory.getSelectedItem().toString();
}
private boolean isDeviceSupportCamera() {
if (getApplicationContext().getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA)) {
return true;
} else {
return false;
}
}
private void captureImage() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
// start the image capture Intent
startActivityForResult(intent, Constants.CAMERA_REQUEST_CODE);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(FILE_URI, fileUri);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
fileUri = savedInstanceState.getParcelable(FILE_URI);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Constants.CAMERA_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
previewCapturedImage();
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(getApplicationContext(),R.string.cameraCanceltToast, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), R.string.cameraFailedToast, Toast.LENGTH_SHORT).show();
}
}
}
private void previewCapturedImage() {
try {
photo.setVisibility(View.VISIBLE);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
bitmap = BitmapFactory.decodeFile(fileUri.getPath(), options);
photo.setImageBitmap(bitmap);
} catch (NullPointerException e) {
e.printStackTrace();
}
}
public Uri getOutputMediaFileUri(int type) {
return Uri.fromFile(getOutputMediaFile(type));
}
private static File getOutputMediaFile(int type) {
File mediaStorageDir = new File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), IMAGE_DIRECTORY_NAME);
// Create the storage directory if it does not exist
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create " + IMAGE_DIRECTORY_NAME + " directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat(DATE_FORMAT, Locale.getDefault()).format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
} else {
return null;
}
return mediaFile;
}
}