Coffee Menu - Android Sample
Android + Java. Using Array List, Preferences Layout Land...
Aplicación móvil Android con Java, desarrollada en Android Studio 4.
Aplicaciones Nativas
Existen aplicaciones nativas y aplicaciones híbridas, la diferencia es que las aplicaciones nativas son desarrolladas para un sistemas operativo en especial, por ejemplo para Android las aplicaciones nativas son desarrolladas usando el Lenguaje de Programación Java y recientemente también con Kotlin y el diseño se hace a través de la estructura XML, esto permite programar controles y diseñar teniendo más inmediatos los recursos del smartphone, recursos como memoria, cámara, sensores, ubicación, entre otros, mientras que una aplicación híbrida es un diseño web adaptado a vistas móviles. Cada una tiene sus ventajas y desventajas dependiendo del uso o los requerimientos de la aplicación.
Hoy en día las aplicaciones híbridas emulan muchas funciones de las aplicaciones nativas, ganando cada vez más terreno en el desarrollo móvil, un ejemplo es ReactNative
Café Menu
Esta aplicación contiene el uso de Preferencias, Listas y un diseño horizontal, es decir como interactuar cuando el móvil cambia de posición vertical (portrait) a horizontal (land). Es un ejemplo dónde seleccionas la cantidad de cafés a ordenar y basado en el precio del café seleccionado en la Lista muestra el total a pagar.
Las preferencias de usuario son variables que se mantienen activas o guardadas incluso después de salir de la aplicación, esto ayuda a mantener datos de configuraciones que el usuario activa dentro de la aplicación sin necesidad de utilizar una base de datos.
Las aplicaciones móviles en Android están desarrolladas a través de Actividades (cada pantalla se declara como una Activity) que contienen la lógica utilizando el lenguaje de Programación Java, y también ahora se utiliza otro lenguaje llamado Kotlin, el diseño o la vista se desarrolla con archivos XML, siempre la actividad principal es nombrada como MainActivity.
MainActivity.java
package com.coffee;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import androidx.appcompat.app.AppCompatActivity;
import com.coffee.R;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import java.text.NumberFormat;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
public static double PRICE_COFFEE = 1.25;
public int mQuantity = 0;
public double mPrice;
public double mSelectedItemPrice;
static final String ARG_QUANTITY = "arg_quantity";
static final String ARG_PRICE = "arg_price";
static final int REQUEST_CODE_MENU = 1; // The request code
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mQuantity = savedInstanceState.getInt(ARG_QUANTITY);
mPrice = savedInstanceState.getDouble(ARG_PRICE);
}
//activity_main.xml contain the design for this Activity
setContentView(R.layout.activity_main);
}
protected void onStart() {
super.onStart();
displayQuantity(mQuantity);
//displayPrice(mPrice);
addMessage();
}
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARG_QUANTITY, mQuantity);
outState.putDouble(ARG_PRICE, mPrice);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
public void increment(View view) {
mQuantity++;
displayQuantity(mQuantity);
}
public void decrement(View view) {
if (mQuantity > 0) {
mQuantity--;
}
displayQuantity(mQuantity);
}
public void order(View view) {
mPrice = mSelectedItemPrice * mQuantity;
displayPrice(mPrice);
addMessage();
}
void displayQuantity(int quantity) {
TextView view = (TextView) findViewById(R.id.quantity);
view.setText("" + quantity);
}
void displayPrice(double price) {
TextView view = (TextView) findViewById(R.id.total);
view.setText(getResources().getString(R.string.total) + ":"
+ NumberFormat.getCurrencyInstance(Locale.US).format(price));
}
void addMessage() {
TextView view = (TextView) findViewById(R.id.total);
String message = view.getText().toString();
SharedPreferences shared_pref = PreferenceManager.getDefaultSharedPreferences(this);
String pref_like_val = shared_pref.getString(
SettingsActivity.KEY_PREF_LIKE, getResources().getString(R.string.like));
message += " \nExcelente, Lo que mas te gusta de nuestro café es su: ";
switch (pref_like_val) {
case "1":
message += " Olor";
break;
case "2":
message += " Sabor";
break;
case "3":
message += " Temperatura";
break;
}
view.setText(message);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
}
if (id == R.id.action_menu) {
Intent intent = new Intent(this, MenuActivity.class);
//startActivity(intent);
startActivityForResult(intent, REQUEST_CODE_MENU);
return true;
}
return super.onOptionsItemSelected(item);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_MENU:
if (data != null) {
mSelectedItemPrice = Double.valueOf(
data.getStringExtra(MenuActivity.MENU_PRICE)
);
mPrice = mSelectedItemPrice * mQuantity;
displayPrice(mPrice);
}
break;
default:
break;
}
}
}
CafeMenu.java
package com.coffee;
/*
* Created by Vladimir Salguero on 25/09/2015.
*/
public class CafeMenu {
private String mName;
private double mPrice;
private boolean mAtari;
public CafeMenu(String name, double price) {
mName = name;
mPrice = price;
mAtari = false;
}
public String getName() {
return mName;
}
public double getPrice() {
return mPrice;
}
public boolean getAtari() {
return mAtari;
}
}
MenuActivity.java
package com.coffee;
import com.coffee.R;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.Arrays;
//Created by Vladimir Salguero on 25/09/2015.
public class MenuActivity extends ListActivity {//implements AdapterView.OnItemLongClickListener {
public static final String MENU_NAME = "menu_name";
public static final String MENU_PRICE = "menu_price";
public static final String MENU_ATARI = "menu_atari";
private static final ArrayList<CafeMenu> LIST_MENU = new ArrayList<CafeMenu>(
Arrays.asList(
new CafeMenu("Cafe Latte", 1.5),
new CafeMenu("Cafe Mocha", 2.5),
new CafeMenu("Cafe Americano", 3.0),
new CafeMenu("Cafe Listo", 0.25)
));
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
MenuArrayAdapter adapter = new MenuArrayAdapter(
this,
R.layout.menu_item,
LIST_MENU);
setListAdapter(adapter);
}
public void onListItemClick(ListView l, View v, int position, long id) {
CafeMenu item = (CafeMenu) getListAdapter().getItem(position);
Intent intent = getIntent();
intent.putExtra(MENU_NAME, item.getName());
intent.putExtra(MENU_PRICE, String.valueOf(item.getPrice()));
setResult(RESULT_OK, intent);
finish();
}
}
MenuArrayAdapter.java
package com.coffee;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Locale;
import com.coffee.R;
//Created by Vladimir Salguero on 25/09/2015.
public class MenuArrayAdapter extends ArrayAdapter<CafeMenu> {
private ArrayList<CafeMenu> mItems;
public MenuArrayAdapter(Context context, int resourceId, ArrayList<CafeMenu> items) {
super(context, resourceId, items);
mItems = items;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.menu_item, null);
}
CafeMenu menu = mItems.get(position);
TextView name = (TextView) v.findViewById(R.id.menu_item_name);
name.setText(menu.getName());
TextView price = (TextView) v.findViewById(R.id.menu_item_price);
price.setText(NumberFormat.getCurrencyInstance(Locale.US).format(menu.getPrice()));
return v;
}
public CafeMenu getItem(int position) {
return mItems.get(position);
}
}
SettingsActivity.java
package com.coffee;
import com.coffee.R;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
//Created by Vladimir Salguero on 25/09/2015.
public class SettingsActivity extends PreferenceActivity {
static final String KEY_PREF_LIKE = "likeplus";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
addPreferencesFromResource(R.xml.preferences);
}
}
Layout
.../main/res/layout
activity_main.xml
<xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title"
android:textSize="40dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/quantity"
android:textColor="#3e5f80"
android:textDirection="rtl"
android:textSize="24dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:onClick="decrement"
android:text="@string/minus"
android:textSize="20dp" />
<TextView
android:id="@+id/quantity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="@string/number"
android:textSize="20dp" />
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:onClick="increment"
android:text="@string/plus"
android:textSize="20dp" />
<LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="@string/price"
android:textSize="24dp" />
<TextView
android:id="@+id/total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:text=""
android:textSize="24dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="order"
android:text="@string/order"
android:textSize="20dp" />
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:scaleType="centerInside"
android:src="@drawable/coffeenight" />
</LinearLayout>
</ScrollView>
</LinearLayout>
activity_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
menu_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:padding="8dp">
<ImageView
android:id="@+id/menu_item_image"
android:layout_width="48dp"
android:layout_height="48dp"
android:scaleType="centerCrop"
android:src="@drawable/cafe" />
<TextView
android:id="@+id/menu_item_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_weight="1"
android:textAppearance="?android:textAppearanceMedium" />
<TextView
android:id="@+id/menu_item_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:textAppearance="?android:textAppearanceMedium" />
</LinearLayout>
../main/res/layout-land
Diseño para la vista horizontal de activity_main.xml
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title"
android:textAllCaps="true"
android:textSize="40dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/quantity"
android:textColor="#3e5f80"
android:textDirection="rtl"
android:textSize="24dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:onClick="decrement"
android:text="@string/minus"
android:textSize="20dp" />
<TextView
android:id="@+id/quantity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="@string/number"
android:textSize="20dp" />
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:onClick="increment"
android:text="@string/plus"
android:textSize="20dp" />
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="@string/price"
android:textSize="24dp" />
<TextView
android:id="@+id/total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:text=""
android:textSize="24dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="order"
android:text="@string/order"
android:textSize="20dp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/coffeenight" />
</LinearLayout>
</LinearLayout>
</ScrollView>