【发布时间】:2016-09-20 11:37:21
【问题描述】:
我正在尝试使用 Navigation Drawer Activity 恢复我的应用程序,但在具有简单活动的旧版本中,我有一些对话框可以从用户那里获取数据并在活动中管理它。
现在我有了片段,但从用户那里取回数据时遇到了一些问题。
我的第一个问题: MainActivity 包含 4 个片段,其中一个有很多在 XML 中使用 onClick 方法的按钮。 使用 Activity 所有工作都没有问题,但使用 Fragments 我无法声明 onClick xml 的方法!
第二个问题是onClick的方法用startActivityForResult调用DialogActivity,用onActivityResult取回数据。 我在包含 Fragment 的 MainActivity 中移动了 onClick 的方法,但是当它使用 startActivityForResult 启动 Dialog 时,Fragments 中的 onActivityResult 没有被调用。
我尝试将它移动到 Activity 内部并将接收到的数据传递给带有接口的 Fragment,但我在 onActivityResult 内部运行Drawable style = setButtonColor(color);时遇到错误
执行此操作的最佳方法是什么? 最好删除 DialogActivity 并使用 DialogFragment 在没有 startActivityForResult 和 onActivityResult 的情况下取回数据?
这里是我需要适应新的 Fragment 图形的代码
<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
我对 Fragments 不熟悉,我需要做一些困难的事情,如果有人可以告诉我怎么做,或者建议更改 onClick 和方法、Fragment 和方法之间的通信,我来了!
【问题讨论】:
标签: android android-fragments android-activity dialogfragment