2016-09-16 3 views
0

私はandroid:"onClick" = addMateria;を設定していますので、別のIDを持つ別のButtonsを持っていますが、問題は私がフラグメントを使用しており、彼はFragmentのメソッドaddMateriaを見ることができません。onActivityResultはデータをフラグメントに戻しません

したがって、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ですデータベース?

私が持っているもの: Aビューは、ボタンonとメソッドonClickを持つ80個のボタンで構成され、結果のアクティビティを開始します。私は宣言した場合、それはフラグメント内に直接それを宣言することは不可能だ、XML内のonClickと呼ば 方法addMateria、および: このメソッドは、ユーザーからのデータを取るdialogActivityを開始し、断片

にonActivityResultの問題を送り返しますその中にフラグメントを含むActivity onActivityResultはDialogからデータを取り戻さないので、startActivityForResult(Activity内)とonAcitivtyResult(Fragment内)の間の接続が失われていることをActivityから開始すると思います。

インターフェイスで唯一/最良の方法ですか?

答えて

0

フラグメントとアクティビティの間でデータをやり取りする場合は、インターフェイスを使用することをお勧めします。

インタフェースを使用するには、私はそうのようにコードを変更します:

まずインターフェイスを定義します。

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

は、その後、あなたが私たちのオーバーライド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(); 
    } 
} 

がフラグメントワット内で呼び出されますあなたはあなたのボタンをヒットします。

onAddMateriaClickedアイテムにパラメータとして渡すデータを必ず追加してください。

+0

こんにちはWeava、あなたの提案に感謝します。 私はあなたのメソッドを試してみますが、とにかく私はインターフェイスのないフラグメントの中にaddMateriaメソッドを置くことができませんか? それは唯一の方法ですか? – Dario

+0

onClick関数は、宣言されているのと同じアクティビティまたはフラグメント内のビューに指定する必要があります。あなたのボタンがアクティビティにある場合、そのデータを添付されたフラグメントに送信するための何らかの方法が必要です。他の方法もありますが、これは最もクリーンです。 – Weava

+0

はいonClick関数は、アクティビティにないフラグメントのビュー内にあります。 onClickメソッドを持つすべてのボタンを含むビューは、その内部でonclickメソッドがDialog_Activityを呼び出していくつかのデータを返すFragmentによって管理されますが、Fragment_class内でメソッドを宣言することはできません。 – Dario

関連する問題