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, 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>