Coffee Menu - Android Sample

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.

Android App, using List, Preferences and Layout Land

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>
Github Vladimir Salguero

Descarga el Proyecto completo en GitHub

Support me on Buy me a coffee!

Buy Me A Coffee