2016-09-16 57 views
0

我有80个不同的Buttons与不同的ID,所以我设置android:"onClick" = addMateria;但问题是,我使用片段,他看不到Fragment里面的方法addMateria。onActivityResult不将数据带回片段

所以我把方法放在Activity里面,其中包含Fragment。 该方法调用startActvityForResult,并且Fragment将数据返回。

问题在于碎片不会带回任何东西。 我读了一些建议使用super.onActivityResult或简单调用StartActivityForResult的帖子,但没有改变!

是管理所有的碎片的活动里面的方法

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) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(requestCode == 1) { 
      if (resultCode == Activity.RESULT_OK) { 

       MySQLiteHelper db = new MySQLiteHelper(getActivity()); 

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

内onActivityResult为什么法不启动,我无法保存内接收数据数据库?

我有什么: 甲片段,它的视图是由与80层的按钮与该启动活动为结果的方法的onClick。 此方法开始一个dialogActivity从用户获取数据并发送回与onActivityResult该片段

问题: 方法addMateria调用的onClick内部XML它不可能直接声明它内部片段,并且如果我声明它里面的Activity包含Fragment,onActivityResult不会从Dialog取回数据,所以我认为如果方法从Activity开始,startActivityForResult(内部的Activity)和onAcitivtyResult(内部的Fragment)之间的连接就会丢失。

它与接口的唯一/最好的方式?

回答

0

如果您希望在片段和活动之间传递数据,反之亦然,我推荐使用接口。

要使用的接口,我会修改,像这样的代码:

首先定义接口。

public interface FragmentCommunication { 
    void onAddMateriaClicked(/* Add item(s) you wish to be passed here*/); 
} 

然后实现说在你的片段接口,免去您在onActivityResult方法已经在我们被覆盖的onAddMateriaClicked方法的代码:

public class MyFragment extends Fragment implements FragmentCommunication { 
    //... 
    @Override 
    public void onAddMateriaClicked() { 
     if(requestCode == 1) { 
      if (resultCode == Activity.RESULT_OK) { 

       MySQLiteHelper db = new MySQLiteHelper(getActivity()); 

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

现在我们修改我们的活动来调用onAddMateriaClicked方法时,该按钮已被点击:

public class MyActivity extends Activity { 

    private FragmentCommunication communication; 
    private MyFragment fragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     fragment = new MyFragment(); 
     communication = fragment; 
    } 

    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()); 


     communication.onAddMateriaClicked(); 
     //onStop(); 
    } 
} 

现在onAddMateriaClicked将在片段w内被调用w你打你的按钮。

确保将任何想要传递的数据作为参数添加到onAddMateriaClicked项目中。

+0

嗨Weava,感谢您的建议。 我会尝试你的方法,但无论如何,我不能把方法addMateria里面没有接口的片段? 或者这是唯一的方法? – Dario

+0

必须将onClick函数指定给与声明相同的活动或片段中的视图。如果您的按钮位于“活动”中,则必须有某种方法将数据发送到附加片段。还有其他方法,但我觉得这是最干净的。 – Weava

+0

是的,onClick函数位于不在Activity中的片段视图中。 带有onClick方法的所有按钮的视图由Fragment管理,在他内部onclick方法调用返回一些数据的Dialog_Activity ....但无论如何,我无法在Fragment_class中声明该方法。 – Dario

相关问题