当前位置: 首页 > 知识库问答 >
问题:

通过xml按钮内部的方法实现活动性和片段通信

齐高寒
2023-03-14

我正试图用导航抽屉活动恢复我的应用程序,但在使用简单活动的旧版本中,我有一些对话框,可以从用户那里获取数据,并在活动中对其进行管理。

现在我有了一些片段,通过从用户那里取回数据,我遇到了一些问题。

我的第一个问题是:MainActivity包含4个片段,其中一个有很多按钮,在XML中使用onClick方法。所有的活动都可以正常工作,但对于片段,我不能声明onClick xml的方法!

第二个问题是onClick方法使用startActivityForResult调用DialogActivity,并使用onActivityResult收回数据。我将onClick方法移动到包含片段的MainActivity中,但当它使用startActivityForResult启动对话框时,不会调用片段中的onActivityResult。

我试图将其移动到活动中,并将接收到的数据传递给带有接口的片段,但我在函数Drawable style=setButtonColor(color)时出错 在onActivityResult中

执行此操作的最佳方式是什么?最好删除DialogActivity并使用DialogFragment在没有startActivityForResult和onActivityResult的情况下取回数据?

这里是我需要适应新片段图形的代码

<Button
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="@string/new_button"
         android:id="@+id/m12"
         android:onClick="addMateria"
         android:background="@drawable/buttons"
         android:singleLine="true"
         android:textSize="12sp"
         android:layout_column="2" />

的方法onASE

public void addMateria(View v){

        /* Prendo il nome della risorsa cosi nel ricompilare il progetto non perdo *
         * tutti i riferimenti ai bottoni salvati nel database                     */

        clickedButtonViewId = getResources().getResourceEntryName(v.getId());

        //StartActivityForResult perche mi aspetto la materia inserita dall'altra activity
        Intent myIntent = new Intent(MainActivity.this, DialogAddMateria.class);
        startActivityForResult(myIntent, 1);
        //onStop();
    }

以及我如何取回数据

//Take back data from ActivityAddMateria
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(requestCode == 1) {
            if (resultCode == Activity.RESULT_OK) {

                MySQLiteHelper db = new MySQLiteHelper(getActivity());


                Toast.makeText(getContext(), "DENTRO ACTIVITYRESULT",
                        Toast.LENGTH_LONG).show();

                //Cambio subito il Button
                int resId = getResources().getIdentifier(clickedButtonViewId, "id", getActivity().getPackageName());
                final Button clickedtextView = (Button) getActivity().findViewById(resId);

                String result = data.getStringExtra("result"); //Take the materia from Dialog
                int color = data.getIntExtra("color", 1); //Take the color from Dialog

                //Controllo se il Button è già presente nel db se presente aggiorno se non presente inserisco
                boolean modifica = db.Exists(clickedButtonViewId);

                //Se voglio ripristinare il bottone di default
                if (color == getResources().getColor(R.color.blue_orario)) {

                    //Ripristino la grafica di Default
                    Drawable style = setButtonColor(color);
                    clickedtextView.setBackground(style);
                    clickedtextView.setText("New");

                    //Se la materia è nel database la cancello
                    if (modifica) {

                        db.deleteSingleMateria(clickedButtonViewId);

                    }

                } else {
                    //Quando inserisco un normale bottone colorato
                    if (!modifica) {

                        //Materia da inserire in un nuovo spazio
                        db.addMateriaToDb(new Materia(clickedButtonViewId, result, color));

                    } else {

                        //Materia già presente nel Button quindi aggiorno la materia
                        db.updateMateria(new Materia(clickedButtonViewId, result, color));
                        Toast.makeText(getContext(), "Materia modificata!",
                                Toast.LENGTH_LONG).show();
                    }

                    //Inserisco la materia nel DB dei voti_media
                    db.addMateriaVotiFromOrario(new MaterieVoti(result, 0.0));

                    clickedtextView.setText(result);
                    //clickedtextView.setBackgroundColor(color);
                    //clickedtextView.getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY);
                    Drawable style = setButtonColor(color);
                    clickedtextView.setBackground(style);
                }
            }

            if (resultCode == Activity.RESULT_CANCELED) {
                //Nessuna materia inserita
            }

        }
    }//onActivityResult

我不熟悉片段,我很难做我需要的事情,如果有人能告诉我怎么做,或者建议改变onClick和方法、片段和方法之间的通信,我就在这里!


共有2个答案

越飞鸾
2023-03-14

将所有内容添加到主活动:

在片段的xml中调用的方法,如果按下startActivityForResult按钮从用户获取数据。

之后,我在main活动中写入onActivityResult,当返回数据时,将其保存到DB中,并修改片段中按钮的样式。

包含碎片的主要活动

public void addMateria(View v){

        /* Prendo il nome della risorsa cosi nel ricompilare il progetto non perdo *
         * tutti i riferimenti ai bottoni salvati nel database                     */

        clickedButtonViewId = getResources().getResourceEntryName(v.getId());

        //StartActivityForResult perche mi aspetto la materia inserita dall'altra activity
        Intent myIntent = new Intent(MainActivity.this, DialogAddMateria.class);
        startActivityForResult(myIntent, 1);
        //onStop();
    }

    //Take back data from ActivityAddMateria
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(requestCode == 1) {
            if (resultCode == Activity.RESULT_OK) {

                MySQLiteHelper db = new MySQLiteHelper(this);

                //Cambio subito il Button
                int resId = getResources().getIdentifier(clickedButtonViewId, "id", getPackageName());
                final Button clickedtextView = (Button) findViewById(resId);

                String result = data.getStringExtra("result"); //Take the materia from Dialog
                int color = data.getIntExtra("color", 1); //Take the color from Dialog

                //Controllo se il Button è già presente nel db se presente aggiorno se non presente inserisco
                boolean modifica = db.Exists(clickedButtonViewId);

                //Se voglio ripristinare il bottone di default
                if (color == getResources().getColor(R.color.blue_orario)) {

                    //Ripristino la grafica di Default
                    Drawable style = setButtonColor(color);
                    clickedtextView.setBackground(style);
                    clickedtextView.setText("...");

                    //Se la materia è nel database la cancello
                    if (modifica) {

                        db.deleteSingleMateria(clickedButtonViewId);

                    }

                } else {
                    //Quando inserisco un normale bottone colorato
                    if (!modifica) {

                        //Materia da inserire in un nuovo spazio
                        db.addMateriaToDb(new Materia(clickedButtonViewId, result, color));

                    } else {

                        //Materia già presente nel Button quindi aggiorno la materia
                        db.updateMateria(new Materia(clickedButtonViewId, result, color));
                        Toast.makeText(MainActivity.this, "Materia modificata!",
                                Toast.LENGTH_LONG).show();
                    }

                    //Inserisco la materia nel DB dei voti_media
                    db.addMateriaVotiFromOrario(new MaterieVoti(result, 0.0));

                    clickedtextView.setText(result);
                    //clickedtextView.setBackgroundColor(color);
                    //clickedtextView.getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY);
                    Drawable style = setButtonColor(color);
                    clickedtextView.setBackground(style);
                }
            }

            if (resultCode == Activity.RESULT_CANCELED) {
                //Nessuna materia inserita
            }

        }
    }//onActivityResult

片段简单地检查数据库中是否有数据,并更新视图

    List<Materia> materia;


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

       MySQLiteHelper db = new MySQLiteHelper(getActivity());

        //Get all materie inside database
        materia = db.getAllMaterie();
        //change all TextView inputed from user
        if(materia.isEmpty()){
            //do nothing
        }else {
            for (Materia mat : materia) {
                //Change all the Button with values stored inside the database
                int resId = getResources().getIdentifier(mat.getID(), "id", getActivity().getPackageName());
                Button changedButton = (Button) view.findViewById(resId);
                changedButton.setText(mat.getMateria());
                changedButton.setTypeface(null, Typeface.BOLD);

                Drawable style = setButtonColor(mat.getColor());
                changedButton.setBackground(style);
            }
        }

        return view;
    }
庄康胜
2023-03-14

这个问题被问了很多次,活动和片段之间的通信可以通过很多方式完成,比如在捆绑包中传递数据,按照这里解释单例模式,以及使用EventBus。看到这个答案,我已经解释了每个方面,你可以如何做,如果你想要更多的理解,那么就评论它。

官方医生来了

 类似资料:
  • 我需要通过单击片段xml文件上的按钮来打开一个新活动。 XML 爪哇

  • 我试图从碎片屏幕调用一个活动中的方法。 我有一个名为myMethod()的方法,它位于名为MyActivity的活动中;我有一个片段叫做Screen1Fragment。 我想给我的活动打电话。从Screen1Fragment内部创建myMethod(),但我不确定如何执行此操作。 以前,Screen1Fragment是一个活动,因此我扩展了MyActivity,以便可以直接调用myMethod()

  • 我合并了一个水平幻灯片导航组件(这需要使类扩展片段)。滑动部分工作正常。这里我有相应的<code>onClick() 到目前为止,我的代码还不多,所以我不会用相关的布局部分来混淆我的问题。任何帮助都是非常感谢的。 片段#1的Java代码 public class TasksFragment扩展Fragment { @ Override public View oncreate View(layou

  • 我在处理活动和碎片时遇到了一些麻烦。我正处于应用程序开发的早期阶段,最终希望设计一种最有效的方法来整合两个独立的屏幕。 每种方法的好处是什么?你会选择哪种设计?

  • 这个问题多半是征求意见,对我的APP最好的处理方式。我有三个碎片被一个活动处理。片段A有一个可点击的元素照片,片段B有4个可点击的元素按钮。另一个片段只是在照片被点击时显示细节。我在用ActionBarsherlock。 前进和后退按钮需要将照片分别改为下一个或上一个姿势。我可以把照片和按钮放在同一个片段中,但我想把它们分开,以防我想在平板电脑中重新排列它们。 我需要一些建议--我应该把片段A和B