通过xml Button

时间:2016-09-20 11:37:21

标签: android android-fragments android-activity dialogfragment

我正在尝试使用导航抽屉活动恢复我的应用程序,但在具有简单活动的旧版本中,我有一些Dialog,它从用户那里获取数据并在活动中管理它。

现在我已经碎片了,我通过从用户那里获取数据来解决问题。

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

第二个问题是onClick的方法使用startActivityForResult调用DialogActivity并使用onActivityResult恢复数据。 我在包含Fragment的MainActivity中移动了onClick的方法,但是当它使用startActivityForResult启动Dialog时,片段内的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和方法之间的沟通,我有一些我很难做的事情,我就在这里! / p>

2 个答案:

答案 0 :(得分:1)

这个问题被多次询问,活动和片段之间的通信可以通过多种方式完成,比如在数据包中传递数据,按照here解释单例模式,并使用EventBus,请参阅this回答,我已经解释了你如何做到这一点的每个方面,如果你想要更多的理解,那么请评论它。

官方文档为here

答案 1 :(得分:1)

将所有内容添加到MainActivity:

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

之后我在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

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

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