【问题标题】:Acitivity and Fragment communication by a method inside xml ButtonActivity 和 Fragment 通过 xml Button 内部的方法进行通信
【发布时间】:2016-09-20 11:37:21
【问题描述】:

我正在尝试使用 Navigation Drawer Activity 恢复我的应用程序,但在具有简单活动的旧版本中,我有一些对话框可以从用户那里获取数据并在活动中管理它。

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

我的第一个问题: MainActivity 包含 4 个片段,其中一个有很多在 XML 中使用 onClick 方法的按钮。 使用 Activity 所有工作都没有问题,但使用 Fragments 我无法声明 onClick xml 的方法!

第二个问题是onClick的方法用startActivityForResult调用DialogActivity,用onActivityResult取回数据。 我在包含 Fragment 的 MainActivity 中移动了 onClick 的方法,但是当它使用 startActivityForResult 启动 Dialog 时,Fragments 中的 onActivityResult 没有被调用。

我尝试将它移动到 Activity 内部并将接收到的数据传递给带有接口的 Fragment,但我在 onActivityResult 内部运行Drawable style = setButtonColor(color);时遇到错误

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

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

<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" />

onClick的方法

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

我对 Fragments 不熟悉,我需要做一些困难的事情,如果有人可以告诉我怎么做,或者建议更改 onClick 和方法、Fragment 和方法之间的通信,我来了!

【问题讨论】:

    标签: android android-fragments android-activity dialogfragment


    【解决方案1】:

    这个问题被问了很多次,activity和fragment之间的通信可以通过多种方式完成,比如在bundle中传递数据,按照here解释单例模式并使用EventBus,请参阅this答案,我已经解释过了各个方面如何做到这一点,如果您想了解更多,请发表评论。

    官方文档是here

    【讨论】:

    • 是的,但是方法有问题吗?在帖子中,我解释了我的情况,不仅在活动和片段之间传递数据:D。主要问题是我不能在 Fragment (addMateria()) 中声明该方法,如果我在 MainActivity 中声明它,则片段内的 onAcitivityResult 不会从被调用的 DialogAcitivity 中取回数据
    • 在您的片段中,您可以获得活动上下文,您所要做的就是在片段中调用 onActivityResult() 并且您还必须在您的活动中实现它,然后通过调用 super.onActivityResult 在片段中引用它() 就可以解决这个问题了
    • 我用这个解决方案解决了......所有在 MainActivity 中声明......方法 addMateria()......所以 startActivityForResult 和 onAcitivityResult 也是......并且仍在工作......它是正确的我怎样做?或者它有效,但它是非法的:D
    • 如果有帮助,请接受答案,以便其他人获得解决方案
    • 这不是解决方案,因为您只回答了部分问题
    【解决方案2】:

    全部添加到 MainActivity:

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

    之后,我在 MainActivity 中编写 onActivityResult,当取回数据时将其保存到 DB 中并修改 Fragment 中按钮的样式。

    包含片段的MainAcitivty

    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
    

    Fragment 简单检查数据是否在数据库中并更新视图

        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;
        }
    

    【讨论】:

      猜你喜欢
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多