2016-09-16 4 views
0

데이터를하지 않습니다 onActivityResult를.내가 <code>android:"onClick" = addMateria;</code> 설정하지만 문제는 내가 조각을 사용하고 그가 <code>Fragment</code> 내부의 방법 addMateria를 볼 수 있다는 것입니다 그래서 다른 ID를 가진 80 가지 <code>Buttons</code>이 다시 조각

그래서 Fragment을 포함하는 Activity 안에 메서드를 넣습니다. 이 메소드는 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를하다 데이터 베이스?

내가 무엇을 가지고 : 그것은보기 결과에 대한 활동을 시작하는 방법 onclick을 80 개 버튼으로 구성되어있어 의 조각있다. 내가 선언하는 경우가 조각 안에 직접 선언하는 것은 불가능 XML 내부의 onclick 호출 메소드 addMateria 및 : 이 방법은 사용자로부터 데이터를 걸릴 dialogActivity를 시작하고 조각

에 onActivityResult를 함께 문제를 다시 보내 그것의 내부에 단편을 포함하는 활동 onActivityResult는 Dialog에서 데이터를 다시 가져 오지 않으므로, Activity에서 startActivityForResult (Activity 내)와 onAcitivtyResult (Fragment 내) 사이의 연결이 손실된다고 생각합니다.

인터페이스가있는 유일한/가장 좋은 방법은 무엇입니까?

답변

0

조각과 활동간에 데이터를 전달하려는 경우 (또는 그 반대) 인터페이스를 사용하는 것이 좋습니다.

나는과 같이 코드를 수정 것, 인터페이스를 사용하려면

첫 번째는 인터페이스를 정의합니다.

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

그런 다음 당신은 우리의 오버라이드 (override) onAddMateriaClicked 방법에 onActivityResult 방법에 있던 코드를 대체 당신의 조각에서 인터페이스를 말했다 구현 :

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 메소드를 호출하는 우리의 활동을 수정할 때 버튼 클릭되었습니다

이제 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(); 
    } 
} 

이 조각 w 내에서 호출됩니다 암탉은 당신의 단추를 친다.

매개 변수로 전달할 데이터를 모두 onAddMateriaClicked 항목에 추가했는지 확인하십시오.

+0

안녕하세요 Weava, 귀하의 제안에 감사드립니다. 나는 당신의 방법을 시도 할 것이다. 그러나 어쨌든 나는 인터페이스없이 Fragment 안에 addMateria 메서드를 넣을 수 없다? 아니면 유일한 방법입니까? – Dario

+0

onClick 함수는 선언 된 것과 동일한 활동 또는 단편 내의보기에 지정되어야합니다. 귀하의 버튼이 활동에 있다면, 그 데이터를 첨부 된 조각으로 보내는 일종의 방법이 있어야합니다. 다른 방법이 있지만 가장 깨끗한 방법입니다. – Weava

+0

예 onClick 함수는 Activity에없는 단편보기에 있습니다. onClick 메서드가있는 모든 Button보기는 Fragment에 의해 관리되며 onclick 메서드는 Dialog_Activity를 호출하여 일부 데이터를 반환하지만 .... Fragment_class 내부에서 메서드를 선언 할 수 없습니다. – Dario