当前位置: 首页 > 面试题库 >

在pagerAdapter中的片段之间发送数据

东博瀚
2023-03-14
问题内容

您好,我正在尝试在两个片段(armarFragment到cocinaFragment)之间发送数据,但是我不知道该怎么做,因为这两个片段都在同一个Activity(tabsActivity)中,后者实现了一个pagerAdaptar以显示不同片段。在这里,我把我的代码。谢谢。

  1. tabsActivity.java(在内部可以找到类pagerAdapter)。
        public class tabsActivity extends AppCompatActivity {

    public MyFragmentPagerAdapter myFragmentPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tabs);

        android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.appbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("Arma tu pizza");

        myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(myFragmentPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.appbartabs);
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
        tabLayout.setupWithViewPager(viewPager);

    }

    @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_login, menu);
        return true;
    }

    @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) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }/*__________________ NEW CLASS, PAGERADAPTAR ____________________*/


    public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
        final int PAGE_COUNT = 4;
        String tabTitles[] =
                new String[] { "Inicio","Armar pizza","Cocina","Chef"};

        public MyFragmentPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return PAGE_COUNT;
        }

        @Override
        public Fragment getItem(int position) {

            Fragment f = null;

            switch(position) {
                case 0:
                    f = inicioFragment.newInstance();
                    break;
                case 1:
                    f = armarFragment.newInstance();
                    break;
                case 2:
                    f = cocinaFragment.newInstance();
                    break;
                case 3:
                    f = chefFragment.newInstance();
                    break;
            }
            return f;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            // Generate title based on item position
            return tabTitles[position];
        }
    }}
  1. armarFregment.java(在内部可以找到viewHolder,但可以忽略它)。
        public class armarFragment extends Fragment implements View.OnClickListener{

    View rootView;

    private RecyclerView recycler;
    private productoAdapter adapter;
    private RecyclerView.LayoutManager lManager;
    private EditText txtNombrePizza;

    private ArrayList<producto> productosSeleccionados;

    Button btnEnviarALaCocina;
    RadioButton pequeña;
    RadioButton mediana;
    RadioButton grande;


    public static armarFragment newInstance() {
        armarFragment fragment = new armarFragment();
        return fragment;
    }

    public armarFragment() {
        productosSeleccionados = new ArrayList<producto>();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_armar, container, false);

        ArrayList<producto> items = new ArrayList<producto>();

        items.add(new producto(R.drawable.jamon, "Jamón", "¡Pssst!, sabe muy bien en pizzas dulces.", 2000));
        items.add(new producto(R.drawable.pollo, "Pollo","¡Pssst!, combina con TODO.",1500));
        items.add(new producto(R.drawable.queso, "Queso","Delicioso queso mozzarela, ¡Yummy Yummy!",2000));
        items.add(new producto(R.drawable.champinones, "Champiñones","Suculentos champiñones equixitos y suaves.",1500));
        items.add(new producto(R.drawable.peperoni, "Pepperoni","Fresco pepperoni con un toque de picante.",3000));
        items.add(new producto(R.drawable.pina, "Piña","¡Fresca y jugosa piña Colombiana papá!",1500));
        items.add(new producto(R.drawable.pasas, "Ciruelas pasas","Las más negritas y a la vez las más dulces.",1500));
        items.add(new producto(R.drawable.salami, "Salami","Delicioso salami en rodajitas así como el salchichon cervecero.",3000));
        items.add(new producto(R.drawable.chorizo, "Chorizo","¡Choricito santarrosano ome!",3000));
        items.add(new producto(R.drawable.cebolla, "Cebolla","La que ha hecho llorar a mas de uno, fresca y suave al paladar",1000));
        items.add(new producto(R.drawable.carnemolida, "Carne molida","Ideal para los arriesgados; fresca y deliciosa.",2500));
        items.add(new producto(R.drawable.pimenton, "Pimentón","Uno de los más enojados; crujiente y exquisito.",1000));
        items.add(new producto(R.drawable.tomate, "Tomate", "Otro rojo más; cosechados en nuestra tierrita.", 1000));
        items.add(new producto(R.drawable.maiz, "Maíz tierno","Se dice por ahi que el maíz es el más tierno",1000));
        items.add(new producto(R.drawable.jalapeno, "Jalapeño", "Si la cebolla te hace lorar imaginate este.", 2000));
        items.add(new producto(R.drawable.tocineta, "Tocineta","Deiciosa tocineta; ideal en pizzas de sal.",500));
        items.add(new producto(R.drawable.aceituna, "Aceituna", "Suaves y jugosas aceitunas, ideales para pizzas con proteinas.", 1000));
        items.add(new producto(R.drawable.oregano, "Orégano","El toque de sabor que nunca ha de faltar.",300));
        items.add(new producto(R.drawable.salsabbq, "Salsa BBQ", "La salsa ideal para pizzas de sal.", 500));

        recycler = (RecyclerView) rootView.findViewById(R.id.reciclador);
        recycler.setHasFixedSize(true);

        btnEnviarALaCocina = (Button) rootView.findViewById(R.id.btnEnviarALaCocina);
        btnEnviarALaCocina.setOnClickListener(this);

        txtNombrePizza = (EditText) rootView.findViewById(R.id.setNombrePizza);

        pequeña = (RadioButton) rootView.findViewById(R.id.radioPersonal);
        pequeña.setOnClickListener(this);
        mediana = (RadioButton) rootView.findViewById(R.id.radioMediana);
        mediana.setOnClickListener(this);
        grande = (RadioButton) rootView.findViewById(R.id.radioGrande);
        grande.setOnClickListener(this);

        // Usar un administrador para LinearLayout
        lManager = new LinearLayoutManager(getContext());
        recycler.setLayoutManager(lManager);

        // Crear un nuevo adaptador
        adapter = new productoAdapter(items);

        recycler.setAdapter(adapter);

        recycler.setItemAnimator(new DefaultItemAnimator());

        return rootView;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnEnviarALaCocina:

                String nombrePizza = txtNombrePizza.getText().toString();

                productosSeleccionados = adapter.getProductosSeleccionados();

                Log.i("prueba 1", "size: " + productosSeleccionados.size());

                ArrayList<String> nombreProductos = new ArrayList<String>();
                ArrayList<Integer> precioProductos = new ArrayList<Integer>();

                for(producto p: productosSeleccionados){
                    nombreProductos.add(p.getNombre());
                    precioProductos.add(p.getPrecio());
                }

                if(productosSeleccionados.size() == 0){

                    Toast.makeText(getContext(), "Debes seleccionar ingredientes.",
                            Toast.LENGTH_LONG).show();

                }else if(nombrePizza.matches("")) {

                    Toast.makeText(getContext(), "Debes ponerle un nombre a la pizza.",
                            Toast.LENGTH_LONG).show();
                }else if(pequeña.isChecked() == false && mediana.isChecked() == false && grande.isChecked() == false){

                    Toast.makeText(getContext(), "Debes selecionar un tamaño.",
                            Toast.LENGTH_LONG).show();
                }

                break;
        }
    }

    /*______________________________________________________________________________________________
    NEW CLASS, PRODUCTOVIEWHOLDER
     _______________________________________________________________________________________________*/

    public class productoAdapter extends RecyclerView.Adapter<productoAdapter.productoViewHolder> {

        private ArrayList<producto> productosSeleccionados;
        private ArrayList<producto> productos;

        public class productoViewHolder extends RecyclerView.ViewHolder {

            // Campos respectivos de un item
            public ImageView imgProducto;
            public TextView txtNombre, txtDescripcion, txtPrecio;
            public Button btnAgregar;

            public productoViewHolder(View v) {
                super(v);
                imgProducto = (ImageView) v.findViewById(R.id.imgProducto);
                txtNombre = (TextView) v.findViewById(R.id.txtNombre);
                txtDescripcion = (TextView) v.findViewById(R.id.txtDescripcion);
                txtPrecio = (TextView) v.findViewById(R.id.txtPrecio);
                btnAgregar = (Button) v.findViewById(R.id.btnAgregar);
            }
        }

        public productoAdapter(ArrayList<producto> items) {
            productosSeleccionados = new ArrayList<producto>();
            this.productos = items;
        }


        public ArrayList<producto> getProductosSeleccionados(){
            return productosSeleccionados;
        }

        public int getItemCount() {
            return productos.size();
        }

        public productoViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.card_productos, viewGroup, false);

            return new productoViewHolder(v);
        }

        public void onBindViewHolder(productoViewHolder viewHolder, final int i) {
            viewHolder.imgProducto.setImageResource(productos.get(i).getImagen());
            viewHolder.txtNombre.setText(productos.get(i).getNombre());
            viewHolder.txtDescripcion.setText(productos.get(i).getDescripion());
            viewHolder.txtPrecio.setText("$ " + String.valueOf(productos.get(i).getPrecio()));
            viewHolder.btnAgregar.setOnClickListener(new View.OnClickListener(){

                @Override
                public void onClick(View v) {
                    productosSeleccionados.add(productos.get(i));

                }
            });
        }
    }}
  1. cocinaFrgment.java(在内部可以找到viewHolder,但可以忽略它)。

公共类cocinaFragment扩展Fragment {

    View rootView;

    private RecyclerView recycler;
    private RecyclerView.Adapter adapter;
    private RecyclerView.LayoutManager lManager;

    ArrayList<pizza> items;

    public static cocinaFragment newInstance() {
        cocinaFragment fragment = new cocinaFragment();
        return fragment;
    }

    public cocinaFragment() {
        items = new ArrayList<pizza>();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_cocina, container, false);


        recycler = (RecyclerView) rootView.findViewById(R.id.reciclador);
        recycler.setHasFixedSize(true);

        // Usar un administrador para LinearLayout
        lManager = new LinearLayoutManager(getContext());
        recycler.setLayoutManager(lManager);

        // Crear un nuevo adaptador
        adapter = new pizzaAdapter(items);
        recycler.setAdapter(adapter);

        return rootView;
    }


    /*______________________________________________________________________________________________
    NEW CLASS, PIZZAVIEWHOLDER
     _______________________________________________________________________________________________*/

    public class pizzaAdapter extends RecyclerView.Adapter<pizzaAdapter.pizzaViewHolder> implements View
    .OnClickListener{
        private ArrayList<pizza> pizzas;

        private View.OnClickListener listener;

        public class pizzaViewHolder extends RecyclerView.ViewHolder {
            // Campos respectivos de un item
            public TextView txtNombrePizza, txtTamaño, txtIngredientes, txtPrecio;

            public pizzaViewHolder(View v) {
                super(v);
                txtNombrePizza = (TextView) v.findViewById(R.id.txtNombrePizza);
                txtTamaño = (TextView) v.findViewById(R.id.txtTamaño);
                txtIngredientes = (TextView) v.findViewById(R.id.txtIngredientes);
                txtPrecio = (TextView) v.findViewById(R.id.txtPrecio);
            }
        }

        public pizzaAdapter(ArrayList<pizza> items) {
            this.pizzas = items;
        }


        public int getItemCount() {
            return pizzas.size();
        }


        public pizzaViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.card_pizzas, viewGroup, false);

            v.setOnClickListener(this);

            return new pizzaViewHolder(v);
        }

        public void setOnClickListener(View.OnClickListener listener) {
            this.listener = listener;
        }

        @Override
        public void onClick(View view) {
            if(listener != null)
                listener.onClick(view);
        }



        public void onBindViewHolder(pizzaViewHolder viewHolder, int i) {
            viewHolder.txtNombrePizza.setText(pizzas.get(i).getNombre());
            viewHolder.txtTamaño.setText(pizzas.get(i).getTamaño());
            viewHolder.txtIngredientes.setText(pizzas.get(i).getIngredientes());
            viewHolder.txtPrecio.setText("$ " + String.valueOf(pizzas.get(i).getPrecio()));
        }
    }


}

问题答案:

好的,正如android准则所述,您必须在片段中创建一个接口。例如:

    public class armarFragment extends Fragment implements View.OnClickListener{
        ...
        private armarFragmentListener mListener;

        public interface armarFragmentListener {
            void onEnviar ();
        }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (armarFragmentListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement armarFragmentListener ");
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnEnviarALaCocina:
                //Do what you want.
                mListener.onEnviar(/*Change interface to pass arguments if you want*/);
            break;
        }
    }

您的活动必须实现该接口并执行相应的操作,例如,调用片段的方法以获取数据。拥有数据后,您可以将其作为参数传递给新片段或以其他方式传递给新片段。

当您在android studio中创建空白片段时,默认情况下会将其放在类中。创建一个新的空白片段并进行查看。



 类似资料:
  • 在适配器中 Holder.NameExam2.SetOnClickListener(新建View.OnClickListener(){ 成碎片 @覆盖公共视图onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ 它在getString()中调用空指针异常。如何解决。

  • 我正试图做到这一点:http://android-er.blogspot.com/2012/06/communication-between-fragments-in.html只不过我用的是一台碎纸机 我有一个有两个片段的活动 FragmentA有一个编辑文本和一个按钮,FragmentB有一个文本视图 现在我想要的是,每当我在编辑文本中输入一些内容并单击按钮时,我的文本视图中就会出现一些内容。

  • 我有一个包含EditText的片段,当我单击该EditText时,会出现一个DatePicker对话框来选择日期。 FragmentFile 对话框片段 问题是我不知道如何将数据(选定日期)从DialogFraank传递到片段? 我读了一些主题,但这并没有帮助我感到困惑(抱歉再次提出这个问题)。 主题1主题2

  • 需要帮助在视图寻呼机中的片段之间传递数据!我们尝试将数据作为包传递到片段中。碎片内部。方法,并尝试从另一个片段获取数据。getArguments()。 活动代码 片段代码: 在片段之间传递数据时需要帮助