1

我試圖用導航抽屜活動恢復我的應用程序,但是在帶有簡單活動的舊版本中我有一些從用戶處獲取數據並在活動內部管理它的對話框。通過xml中的方法進行活動和片段通信按鈕

現在我已經有碎片,並通過從用戶處獲取數據來解決某些問題。

我的第一個問題: 在MainActivity包含4個片段,其中一人有很多,在XML使用一個onClick方法按鈕。 活動所有的工作沒有問題,但與片段我不能聲明onClick的XML的方法!

第二個問題是onClick調用帶有startActivityForResult的DialogActivity並使用onActivityResult取回數據的方法。 我移動了包含Fragment的MainActivity中的onClick方法,但是當它通過startActivityForResult啓動對話框時,OnActivityResult裏面的Fragments沒有被調用。

我試着將它移到活動中,並與接口通過接收到的數據片段,但我得到錯誤的功能Drawable style = setButtonColor(color);的onActivityResult

什麼是執行最好的辦法裏面? 更好地移除DialogActivity並使用DialogFragment取回數據而無需startActivityForResult和onActivityResult?

在這裏,我需要用新的片段圖形

<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 

我適應代碼我不熟悉碎片,如果有人能告訴我該怎麼做,或者我有一些難以做到的事情建議改變onClick和方法,片段和方法之間的溝通,我在這裏!

回答

1

全部加入到在MainActivity:

稱爲在該片段的XML的方法,如果按鈕被按壓startActivityForResult用於從用戶獲取數據。

之後,我在MainActivity內寫入onActivityResult,當它將數據保存到數據庫並修改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; 
    } 
1

這個問題被問了很多次,活動和片段之間的通信可以通過多種方式來完成像束傳遞數據,使Singleton模式解釋每here和使用EventBus也看到this的答案,我已經解釋了每個環節如何你可以做到這一點,如果你想更多的理解,然後評論它。

正式文檔是here

+0

是,但問題的方法? 在後我解釋我的情況不僅在活動和片段之間傳遞數據:D。 主要問題是我不能在Fragment(addMateria())中聲明該方法,如果我在MainActivity中聲明它,onAcitivityResult內部片段不會從被調用的DialogAcitivity中取回數據 – Dario

+0

在片段內部可以獲取活動上下文所有你需要做的就是在片段中調用onActivityResult(),並且你還必須在你的活動中實現它,然後通過調用super.onActivityResult()將它引用到片段中,並且你可以解決這個問題 – TapanHP

+0

我解決了這個問題。 ..所有在MainActivity中聲明的方法addMateria()...所以startActivityForResult和onAcitivityResult太...並仍在工作...這是正確的,我怎麼做? 或它的工作,但它是非法的:D – Dario