Skip to content

Commit

Permalink
Terminada la construcción de la app de postres, necesaria para compre…
Browse files Browse the repository at this point in the history
…nder mejor la nueva implementación de navigation en android, las transiciones, y animaciones aplicadas con navcontroler y el paso de argumentos a través del mismo
  • Loading branch information
hall9zeha committed Jan 27, 2022
1 parent 67f8754 commit 2b45cd3
Show file tree
Hide file tree
Showing 25 changed files with 572 additions and 58 deletions.
1 change: 1 addition & 0 deletions Material_Components_App_Navigation/.idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion Material_Components_App_Navigation/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Material_Components_App_Navigation/app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
id 'com.android.application'
id 'androidx.navigation.safeargs'
}

android {
Expand Down Expand Up @@ -37,6 +38,7 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'androidx.navigation:navigation-fragment:2.3.5'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.navigation:navigation-ui:2.3.5'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.barryzeha.mdpostres;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.barryzeha.mdpostres.databinding.ItemCarBinding;

public class CarAdapter extends RecyclerView.Adapter<CarAdapter.ViewHolder> {
private String[] products;

public CarAdapter(String[] products) {
this.products = products;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemCarBinding bind=ItemCarBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false);

return new ViewHolder(bind);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.bind(products[position]);
}

@Override
public int getItemCount() {
return products.length;
}

public class ViewHolder extends RecyclerView.ViewHolder {
private ItemCarBinding bind;
public ViewHolder(@NonNull ItemCarBinding itemView) {
super(itemView.getRoot());
bind=itemView;
}
protected void bind(String product){
bind.tvName.setText(product);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,63 +2,69 @@

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment;
import androidx.recyclerview.widget.LinearLayoutManager;

import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;

/**
* A simple {@link Fragment} subclass.
* Use the {@link CarFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class CarFragment extends Fragment {

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
import com.barryzeha.mdpostres.databinding.FragmentCarBinding;
import com.google.android.material.transition.MaterialSharedAxis;

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

public CarFragment() {
// Required empty public constructor
}
public class CarFragment extends Fragment {

/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment CarFragment.
*/
// TODO: Rename and change types and number of parameters
public static CarFragment newInstance(String param1, String param2) {
CarFragment fragment = new CarFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}

private FragmentCarBinding bind;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}

setHasOptionsMenu(true);
setEnterTransition(new MaterialSharedAxis(MaterialSharedAxis.X, true));
setReturnTransition(new MaterialSharedAxis(MaterialSharedAxis.X, false));

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_car, container, false);
bind=FragmentCarBinding.inflate(inflater, container, false);

//Cargamos el adapter car con los argumentos enviados a través del navigation
CarAdapter adapter=new CarAdapter(CarFragmentArgs.fromBundle(getArguments()).getProductsArgs());
bind.recyclerViewCar.setLayoutManager(new LinearLayoutManager(getContext()));
bind.recyclerViewCar.setAdapter(adapter);
bind.tvSum.setText(getString(R.string.car_sum, (float)adapter.getItemCount()));

/*
* Para navegar con el navHostNavigation controler puede usarse como id de navigate el id del fragmento de destino asi como
* el id de la acción creada
* */
bind.btnBack.setOnClickListener(v->{
NavHostFragment.findNavController(this)
//.navigate(R.id.productFragment); 1ra opción solo el fragmento de destino
.navigate(R.id.action_car_to_product); // segunda opción id de acción
});

bind.btnPay.setOnClickListener(v->{
NavHostFragment.findNavController(this)
//.navigate(R.id.productFragment); 1ra opción solo el fragmento de destino
.navigate(R.id.action_car_to_confirmation); // segunda opción id de acción
});


return bind.getRoot();
}

@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
menu.clear();
super.onPrepareOptionsMenu(menu);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.barryzeha.mdpostres;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment;

import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;

import com.barryzeha.mdpostres.databinding.FragmentConfirmationBinding;
import com.google.android.material.transition.MaterialFadeThrough;
import com.google.android.material.transition.MaterialSharedAxis;

public class ConfirmationFragment extends Fragment {


private FragmentConfirmationBinding bind;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
setEnterTransition(new MaterialSharedAxis(MaterialSharedAxis.X, true));
setReturnTransition(new MaterialSharedAxis(MaterialSharedAxis.X, false));
setExitTransition(new MaterialFadeThrough());
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
bind=FragmentConfirmationBinding.inflate(inflater, container, false);
return bind.getRoot();
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
bind.btnDone.setOnClickListener(v->{
NavHostFragment.findNavController(this).navigate(R.id.action_confirmation_to_product);
});
}

@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
menu.clear();
super.onPrepareOptionsMenu(menu);
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,68 @@
package com.barryzeha.mdpostres;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {
import com.barryzeha.mdpostres.databinding.ActivityMainBinding;
import com.google.android.material.bottomsheet.BottomSheetBehavior;

public class MainActivity extends AppCompatActivity {
private ActivityMainBinding bind;
private NavController navController;
private BottomSheetBehavior bottomSheetBehavior;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bind = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(bind.getRoot());

setSupportActionBar(bind.toolbar);
navController= Navigation.findNavController(this, R.id.nav_host_fragment);

AppBarConfiguration appBarConfiguration= new AppBarConfiguration.Builder(navController.getGraph()).build();
NavigationUI.setupWithNavController(bind.toolbar, navController, appBarConfiguration);
//para quitar el ícono de back del toolbar por medio de navigation hacemos lo siguiente

navController.addOnDestinationChangedListener((controller, destination, arguments) -> {
//mantenemos el título del toolbar
bind.toolbar.setTitle(destination.getLabel());
//quitamos el bobon de regresar
bind.toolbar.setNavigationIcon(null);
});
bottomSheetBehavior=BottomSheetBehavior.from(bind.bottomSheet.bottomSheet);
bottomSheetBehavior.setState(bottomSheetBehavior.STATE_HIDDEN);
bind.bottomSheet.ivClose.setOnClickListener(v-> bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN));
bind.bottomSheet.btnExit.setOnClickListener(v-> finish());

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
/* if(item.getItemId()==R.id.itemConfirmation){
navController.navigate(R.id.action_global_confirmation);
}
return super.onOptionsItemSelected(item);*/
//Ahora haremos navegación por id
return NavigationUI.onNavDestinationSelected(item, navController)||
super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}
}
Loading

0 comments on commit 2b45cd3

Please sign in to comment.