Arquitectura
Ejecutable
Estructura del proyecto
Ejemplo de POJO:
setContentView(R.layout.mi_vista)
Ejemplo
Alumno alumno = new Alumno();
alumno.setNombre("Carlos Salazar");
alumno.setFechaNacimiento(new Date());
alumno.setNumero_cuenta(1234567);
View
ViewGroup
LinearLayout
RelativeLayout
ListView y GridView
ScrollView
FrameLayout
ConstraintLayout
CoordinatorLayout
Layouts tips
android:inputType="TIPO DE TEXTO"
android:onClick="[metodo]"
public void [metodo](View view) {}
Aplicación
android:id="@+id/[id_asignado]"
Todo view agregado en el xml ya tiene vida, es decir, ya es un objeto creado que tiene una referencia en memoria, en este caso la referencia es el id que le asignamos. Con este id podemos acceder a ese objeto desde el controlador JAVA.
Para acceder a la referencia, debemos entender que es tomado en cuenta como un “recurso”, estas referencias son almacenadas dentro de un archivo denominado R, por ello, para acceder a ellas debemos pasar por R.
Ejemplo en Java
EditText edtNombre = findViewById(R.id.[identificador])
Si te das cuenta, luego de R accedimos a id. Así mismo se puede obtener cualquier recurso de R.drawable.XXX, R.dimen.xxx, R.string.XXX*, etc.
Ejemplo para evento onClick. Recibe la información de un TextView y la muestra a través de un Toast.
public void enviarDatos(Viewview) {
EditText edtNombre = (EditText) findViewById(R.id.nombre);
String nombre = edtNombre.getText().toString();
Toast.makeText(getBaseContext(),"Felicidades, tu nombre es " + nombre, Toast.LENGTH_LONG).show();
}
Tema
res > values > styles.xml
Material Design ofrece una librería de soporte con estos widgets y que además son compatibles con versiones anteriores android.support.v7.widget.Cardview
Más información sobre las librerías de soporte de Google - https://developer.android.com/topic/libraries/support-library/features.html#v7
<activityandroid:name=".NombreActivity"><intent-filter><actionandroid:name="android.intent.action.MAIN" /><categoryandroid:name="android.intent.category.LAUNCHER" /></intent-filter></activity>
Creando un Activity
Ciclo de vida (resumen por @JuanGonzalez97)
onCreate(Bundle): Se llama en la creación de la actividad. Se utiliza para realizar todo tipo de inicializaciones, como la creación de la interfaz de usuario o la inicialización de estructuras de datos. Puede recibir información de estado de la actividad (en una instancia de la clase Bundle), por si se reanuda desde una actividad que ha sido destruida y vuelta a crear.
onStart(): Nos indica que la actividad está a punto de ser mostrada al usuario.
onResume(): Se llama cuando la actividad va a comenzar a interactuar con el usuario.
onPause(): Indica que la actividad está a punto de ser lanzada a segundo plano, normalmente porque otra actividad es lanzada.
onStop(): La actividad ya no va a ser visible para el usuario.
onRestart(): Indica que la actividad va a volver a ser representada después de haber pasado por onStop().
onDestroy(): Se llama antes de que la actividad sea totalmente destruida. Por ejemplo, cuando el usuario pulsa el botón de volver o cuando se llama al método finish().
namespace
Imagenes densificadas
Textos
<stringname="variable_string">Soy un texto</string>
android:xxxxx="@string/variable_string"
android:textSize="@dimen/VARIABLE"
android:theme="@style/NOMBRE DE ESTILO
Internacionalización de texto
Creando un estilo personalizado
<stylename="CLASE u OBJETO"parent="SUELE SER EL TEMA PADRE"></style>
<itemname="VARIABLE">NUEVA CARACTERISTICA</item>
<style name="RaisedButtonDark" parent="Theme.AppCompat.Light">
<itemname="colorButtonNormal">@color/colorPrimaryDark</item>
<itemname="colorControlHighlight">@color/colorPrimary</item>
<itemname="textColor">@android:color/white</item>
</style>
<Button
android:id="@+id/login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/text_button_login"
android:theme="@style/RaisedButtonDark"
/>
EditText con Material Design
<style name="EditTextWhite" parent="TextAppearance.AppCompat">
<itemname="android:textColorHint">@color/textColorWhite</item>
<itemname="android:textSize">@dimen/edittext_textsize_login</item>
<itemname="android:textColorPrimary">@color/textColorWhite</item>
<itemname="colorAccent">@color/textColorWhite</item>
<itemname="colorControlNormal">@color/textColorWhite</item>
<itemname="colorControlActivated">@color/textColorWhite</item>
</style>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:passwordToggleEnabled="true"
android:theme="@style/EditTextWhite"
>
<android.support.design.widget.TextInputEditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_password"
android:inputType="textPassword"
/>
</android.support.design.widget.TextInputLayout>
Toolbar
app:layout_behavior="@string/appbar_scrolling_view_behavior"
<include layout="@layout/actionbar_toolbar"/>
<android.support.design.widget.AppBarLayoutxxxxxxxxxxxxxxxxxx;
>
public void showToolbar(String tittle, boolean upButton){
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle(tittle);
getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(upButton);
}
Donde:
Una vez está definido el método, es necesario invocarlo en el método onCreate de la Activity, sin embargo, debemos definir los parámetros que recibirá el método.
showToolbar(getResources().getString(R.string.[VARIABLE STRING]),false);
Siempre que queramos unir distintos componentes, debemos usar la clase Intent y crear un objeto Intent.
Cuando se usa un Intent, la nueva Activity que se inicia siempre pasará por el método onCreate.
Aplicando un Intent
publicvoidgoCreateAccount(View view){
Intent intent = new Intent(this, CreateAccountActivity.class);
startActivity(intent);
}
Botón Back vs Botón Up
<activityandroid:name=".view.CreateAccountActivity"android:parentActivityName=".LoginActivity"
><meta-dataandroid:name="android.support.PARENT_ACTIVITY"android:value=".LoginActivity"
/></activity>
android:parentActivityName=".LoginActivity"
- Establece directamente la relación con la Activity padre, pero sólo funciona desde Lollypop en adelante.
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".LoginActivity"
/>
- Le damos soporte al establecimiento de la relación con una actividad padre, definida en **value**.
xmlns:cardview="http://schemas.android.com/apk/res-auto"
cardview:cardCornerRadius=""
Personalizar estado de CheckBox
<selectorxmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:drawable="@drawable/heart"android:state_checked="false"></item><itemandroid:drawable="@drawable/heart_full"android:state_checked="true"></item><itemandroid:drawable="@drawable/heart"></item></selector>
android:button="@drawable/checkbox_selector"
dependencies {
implementation 'com.android.support:appcompat-v7:X.X.X'
implementation 'com.android.support:design:X.X.X'
// donde X.X.X es la versión que prefieras usar
}
<android.support.design.widget.BottomNavigationView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottombar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom|end"
android:background="@color/colorPrimary"
app:itemBackground="@drawable/bottombar_itembackground"
app:itemIconTint="@color/textColorWhite"
app:itemTextColor="@color/textColorWhite"
app:menu="@menu/bottombar_menu"
/>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/search"
android:title="@string/tab_search"
android:icon="@drawable/ic_search"
/>
<item
android:id="@+id/home"
android:title="@string/tab_home"
android:icon="@drawable/ic_home"
/>
<item
android:id="@+id/profile"
android:icon="@drawable/ic_user"
android:title="@string/tab_profile" />
</menu>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@color/colorPrimaryDark"/>
<item android:state_pressed="true" android:drawable="@color/colorPrimaryDark"/>
<item android:drawable="@color/colorPrimary" />
</selector>
Por defecto el botón tendrá el colorPrimary.
Cuando el botón sea presionado y cuando esté seleccionado, tendrá el colorPrimaryDark.
Listo, ya el ButtonNavigationView tiene el estilo que deseamos.
Desde este sitio obtuve la información para hacerlo
Implementación del RecyclerView
implementation 'com.android.support:recyclerview-v7:28.x.x-x// donde .x.x-x es la versión
<android.support.v7.widget.RecyclerView
android:id="@+id/pictureRecycler"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
public classPictureAdapterRecyclerView{
public classPictureViewHolderextendsRecyclerView.ViewHolder{
privateImageView pictureCard;
privateTextView userNameCard;
privateTextView timeCard;
//private CheckBox likeCheckCard;privateTextView likeNumberCard;
public PictureViewHolder(@NonNullView itemView) {
super(itemView);
pictureCard = (ImageView) itemView.findViewById(R.id.pictureCard);
userNameCard = (TextView) itemView.findViewById(R.id.userNameCard);
timeCard = (TextView) itemView.findViewById(R.id.timeCard);
likeNumberCard = (TextView) itemView.findViewById(R.id.likeNumberCard);
}
}
}
public classPictureAdapterRecyclerViewextendsRecyclerView.Adapter{
...
publicclass Picture {
privateString picture;
privateString userName;
privateStringtime;
privateString like_number = "0";
}
publicclass Picture {
privateString picture;
privateString userName;
privateString time;
privateString like_number = "0";
public Picture(String picture, String userName, String time, String like_number) {
this.picture = picture;
this.userName = userName;
this.time = time;
this.like_number = like_number;
}
publicString getPicture() {
return picture;
}
publicvoid setPicture(String picture) {
this.picture = picture;
}
publicString getUserName() {
return userName;
}
publicvoid setUserName(String userName) {
this.userName = userName;
}
publicString getTime() {
return time;
}
publicvoid setTime(String time) {
this.time = time;
}
publicString getLike_number() {
return like_number;
}
publicvoid setLike_number(String like_number) {
this.like_number = like_number;
}
}
public classPictureAdapterRecyclerViewextendsRecyclerView.Adapter<PictureAdapterRecyclerView.PictureViewHolder>{
@NonNull@Override
public PictureViewHolder onCreateViewHolder(@NonNullViewGroup viewGroup, int i) {
returnnull;
}
@Override
public void onBindViewHolder(@NonNullPictureViewHolder pictureViewHolder, int i) {
}
@Override
public int getItemCount() {
return0;
}
public classPictureViewHolderextendsRecyclerView.ViewHolder{
...
...
...
}
}
private ArrayList<Picture> pictures;
privateint resource;
private Activity activity;
publicPictureAdapterRecyclerView(ArrayList<Picture> pictures, int resource, Activity activity){
this.pictures = pictures;
this.resource = resource;
this.activity = activity;
}
@NonNull@OverridepublicPictureViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i){
View view = LayoutInflater.from(viewGroup.getContext()).inflate(resource, viewGroup, false);
returnnew PictureViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull PictureViewHolder pictureViewHolder, int i) {
Picture picture = pictures.get(i);
pictureViewHolder.userNameCard.setText(picture.getUserName());
pictureViewHolder.timeCard.setText(picture.getTime());
pictureViewHolder.likeNumberCard.setText(picture.getLike_number());
}
return pictures.size()
public void showToolbar(String tittle, boolean upButton, View view){
Toolbar toolbar = view.findViewById(R.id.toolbar);
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
(((AppCompatActivity) getActivity()).getSupportActionBar()).setTitle(tittle);
((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(upButton);
}
publicclassHomeFragmentextendsFragment{
publicHomeFragment(){
// Required empty public constructor
}
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_home, container, false);
showToolbar("Home", false, view);
RecyclerView picturesRecycler = (RecyclerView) view.findViewById(R.id.pictureRecycler);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
picturesRecycler.setLayoutManager(linearLayoutManager);
PictureAdapterRecyclerView pictureAdapterRecyclerView =
new PictureAdapterRecyclerView(buildPictures(), R.layout.cardview_picture, getActivity());
picturesRecycler.setAdapter(pictureAdapterRecyclerView);
return view;
}
public ArrayList<Picture> buildPictures(){
ArrayList<Picture> pictures = new ArrayList<>();
pictures.add(new Picture("https://images.pexels.com/photos/466685/pexels-photo-466685.jpeg?auto=compress&cs=tinysrgb&h=350", "Nicoll Sarai", "2 horas", "48"));
pictures.add(new Picture("https://images.pexels.com/photos/466685/pexels-photo-466685.jpeg?auto=compress&cs=tinysrgb&h=350", "Carlos Fernández", "1 día", "4"));
pictures.add(new Picture("https://images.pexels.com/photos/466685/pexels-photo-466685.jpeg?auto=compress&cs=tinysrgb&h=350", "Nicoll Sarai", "2 semanas", "8"));
pictures.add(new Picture("https://images.pexels.com/photos/466685/pexels-photo-466685.jpeg?auto=compress&cs=tinysrgb&h=350", "Fraini Salazar", "20 horas", "21"));
pictures.add(new Picture("https://images.pexels.com/photos/466685/pexels-photo-466685.jpeg?auto=compress&cs=tinysrgb&h=350", "Erick Rengel", "1 día", "12"));
pictures.add(new Picture("https://images.pexels com/photos/466685/pexels-photo-466685.jpeg?auto=compress&cs=tinysrgb&h=350", "Nicoll Sarai", "10 minutos", "123"));
return pictures;
}
publicvoidshowToolbar(String tittle, boolean upButton, View view){
Toolbar toolbar = view.findViewById(R.id.toolbar);
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
(((AppCompatActivity) getActivity()).getSupportActionBar()).setTitle(tittle);
((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(upButton);
}
}
Para esto utilizarémos la librería Picasso.
Picasso.get().load(picture.getPicture()).into(pictureViewHolder.pictureCard);
<uses-permission android:name="android.permission.INTERNET"/>
AppBarLayout
CollapsingToolbarLayout
**Creando Activity “Detalles de imagen”
<android.support.design.widget.CoordinatorLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".view.PictureDetailActivity"
><android.support.design.widget.AppBarLayoutandroid:id="@+id/appBar"android:layout_width="match_parent"android:layout_height="@dimen/height_appbarlayout"android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"><android.support.design.widget.CollapsingToolbarLayoutandroid:id="@+id/collapsingToolbar"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_scrollFlags="scroll|exitUntilCollapsed"app:contentScrim="@color/colorPrimary"
><!--
app:layout_scrollFrags : Definimos que los hijos deben poder hacer scroll
app:contentScrim : Es el color que tendra la toolbar una vez colapsa
--><ImageViewandroid:id="@+id/pictureDetailHeader"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop"android:background="@drawable/image"app:layout_collapseMode="parallax"
/><!--
android:scaleType="centerCrop" : La imagen no se estira, se centra y se corta.
app:layout_collapseMode="parallax" : Agrega efecto Parallax mientra colapsa
--><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="wrap_content"android:layout_height="?attr/actionBarSize"app:popupTheme="@style/ThemeOverlay.AppCompat.Light"app:layout_collapseMode="pin"
/><!--
app:layout_collapseMode="pin" : Hace que este view se mantenga fijo
--></android.support.design.widget.CollapsingToolbarLayout></android.support.design.widget.AppBarLayout><android.support.v4.widget.NestedScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"
><!--
app:layout_behavior="@string/appbar_scrolling_view_behavior" :
Este ViewGroup se muestra luego de la Toolbar, no sobre ella
--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingTop="@dimen/padding_vertical_text_card"
><TextViewandroid:id="@+id/usernamePictureDetail"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/textsize_username_detail"android:text="@string/username_card"android:paddingStart="@dimen/padding_horizontal_text_card"android:paddingEnd="@dimen/padding_horizontal_text_card"
/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:paddingBottom="@dimen/padding_vertical_text_card"android:paddingStart="@dimen/padding_horizontal_text_card"android:paddingEnd="@dimen/padding_horizontal_text_card"
><TextViewandroid:id="@+id/likeNumberPictureDetail"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/textsize_likenumber_detail"android:text="10"
/><TextViewandroid:id="@+id/secondWordPictureDetail"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/textsize_likenumber_detail"android:text="@string/secondword_detail"android:layout_marginStart="@dimen/marginleft_secondword"
/></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="@dimen/height_divider"android:background="@android:color/darker_gray"
/><TextViewandroid:id="@+id/tittlePictureDetail"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/textsize_likenumber_detail"android:text="@string/tittle_picturedetail"android:layout_gravity="center_horizontal"android:textStyle="bold"android:paddingTop="@dimen/paddingtop_tittle_picturedetail"
/><TextViewandroid:id="@+id/textContentPictureDetail"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/textsize_likenumber_detail"android:text="@string/lorem"android:layout_gravity="center_horizontal"android:paddingTop="@dimen/paddingtop_tittle_picturedetail"android:paddingStart="@dimen/padding_horizontal_textcontent_picturedetail"android:paddingEnd="@dimen/padding_horizontal_textcontent_picturedetail"
/></LinearLayout></android.support.v4.widget.NestedScrollView><android.support.design.widget.FloatingActionButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="@dimen/fab_margin"android:src="@drawable/heart"app:layout_anchor="@+id/appBar"app:layout_anchorGravity="bottom|end"
/><!--
app:layout_anchor="@+id/appBar" : Hace que este view cuelgue sobre appBar
app:layout_anchorGravity="bottom|end" : Le da una gravedad al view en relacion al anchor
--></android.support.design.widget.CoordinatorLayout>
public classPictureDetailActivityextendsAppCompatActivity{
@Overrideprotected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_picture_detail);
showToolbar("", true);
}
// No hace falta el parámetro view porque estamos trabajando en un activity, no en fragment. Lo mismo pasa con el ((AppCompatActivity) getActivity()).
public void showToolbar(String tittle, boolean upButton){
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle(tittle);
getSupportActionBar().setDisplayHomeAsUpEnabled(upButton);
// Esto lo dejamos por acá porque seguramente lo necesitarémos luego, simplemente un objeto.CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsingToolbar);
}
}
<activityandroid:name=".view.PictureDetailActivity"android:parentActivityName=".view.ContainerActivity"><meta-dataandroid:name="android.support.PARENT_ACTIVITY"android:value=".view.ContainerActivity" /></activity>
pictureViewHolder.pictureCard.setOnClickListener(new View.OnClickListener() {
@OverridepublicvoidonClick(View view){
Intent intent = new Intent(activity, PictureDetailActivity.class);
activity.startActivity(intent);
}
});
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".view.fragment.ProfileFragment"
>
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarProfile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"
android:background="@color/colorPrimary"
>
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsingToolbarProfile"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/usernameProfile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/username_card"
android:textColor="@color/textColorWhite"
android:textSize="@dimen/textsize_username_profile"
/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbarProfile"
android:layout_width="wrap_content"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/circleImageProfile"
android:layout_width="@dimen/dimen_circleimage_profile"
android:layout_height="@dimen/dimen_circleimage_profile"
android:src="@drawable/image"
android:layout_gravity="center|top"
android:layout_marginTop="@dimen/margintop_circleimage_profile"
android:elevation="@dimen/elevation_circleimage_profile"
/>
</android.support.design.widget.CoordinatorLayout>
Aquí está la documentación del plugin que nos permite establecer comportamientos en Views, dependiendo del comportamiento de otro view. Es super sencillo de usar.
https://github.com/zoonooz/simple-view-behavior
android:transitionName="@string/transitionname_X"
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
Explode explode = new Explode();
explode.setDuration(1000);
activity.getWindow().setExitTransition(explode);
activity.startActivity(intent, ActivityOptionsCompat.makeSceneTransitionAnimation(activity, view, activity.getString(R.string.transitionname_picture)).toBundle());
} else {
activity.startActivity(intent);
}
getWindow().setExitTransition(new Explode);
activity.startActivity(intent, ActivityOptionsCompat.makeSceneTransitionAnimation(activity, view, activity.getString(R.string.transitionname_picture)).toBundle());
Donde definimos que se ejecutará una animación de transición y recibirá como parámetros:
Luego del makeSceneTransitionAnimation(…) agregamos .toBundle().
Nos resta definir la transición de entrada. Nos ubicamos en el elemento de entrada, en onCreate() en caso de que sea el método que queremos controlar y hacemos lo mismo, validamos y ejecutamos la transición.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
getWindow().setEnterTransition(new Fade());
}
La StatusBar puede ser transparente sólo a partir de Lollypop (API 21). Para esto, en el archivo styles v-21 copiamos el estilo:
<stylename="AppTheme"parent="Theme.AppCompat.Light.NoActionBar">
y agregamos un nuevo item:
<item name="android:statusBarColor">@android:color/transparent</item>