我試圖用導航抽屜活動恢復我的應用程序,但是在帶有簡單活動的舊版本中我有一些從用戶處獲取數據並在活動內部管理它的對話框。通過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和方法,片段和方法之間的溝通,我在這裏!
是,但問題的方法? 在後我解釋我的情況不僅在活動和片段之間傳遞數據:D。 主要問題是我不能在Fragment(addMateria())中聲明該方法,如果我在MainActivity中聲明它,onAcitivityResult內部片段不會從被調用的DialogAcitivity中取回數據 – Dario
在片段內部可以獲取活動上下文所有你需要做的就是在片段中調用onActivityResult(),並且你還必須在你的活動中實現它,然後通過調用super.onActivityResult()將它引用到片段中,並且你可以解決這個問題 – TapanHP
我解決了這個問題。 ..所有在MainActivity中聲明的方法addMateria()...所以startActivityForResult和onAcitivityResult太...並仍在工作...這是正確的,我怎麼做? 或它的工作,但它是非法的:D – Dario