Android App, using Array List, Preferences and Layout Land

CoffeMenu Android Sample 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, y 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 LIST_MENU = new ArrayList(
            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 {

    private ArrayList mItems;

    public MenuArrayAdapter(Context context, int resourceId, ArrayList 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

<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

Repositorio en GitHub




Support the project, Buy me a coffee!!

buymeacoffee