我有80个不同的Buttons
具有不同的ID,所以我设置了android:"onClick" = addMateria;
,但问题是我使用Fragment并且他无法在Fragment
内看到方法addMateria。
所以我把方法放在包含Activity
的{{1}}内。
此方法调用startActvityForResult,Fragment将数据恢复。
问题在于片段不会带回任何东西。
我读了一些建议使用Fragment
或简单调用super.onActivityResult
的帖子,但没有任何变化!
管理所有碎片的Activity内部的方法
StartActivityForResult
这是Fragment中的onActivityResult
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();
}
为什么方法无法启动,我无法将收到的数据保存在数据库中?
我有什么: 它的视图片段由80个按钮和一个onClick方法组成,它为结果启动一个Activity。 此方法启动一个dialogActivity,它从用户获取数据并使用onActivityResult发送回Fragment
问题: 使用onClick在xml内部调用addMateria方法,不可能直接在片段内声明它,如果我在包含Fragment的Activity中声明它,onActivityResult不会从Dialog中取回数据,所以我认为如果方法从Activity开始startActivityForResult(在Activity内)和onAcitivtyResult(在Fragment内)之间的连接丢失。
接口的唯一/最佳方式?
答案 0 :(得分:0)
如果您希望在片段和活动之间传递数据,反之亦然,我建议使用接口。
要使用接口,我会像这样修改你的代码:
首先定义界面。
public interface FragmentCommunication {
void onAddMateriaClicked(/* Add item(s) you wish to be passed here*/);
}
然后在您的片段中实现所述接口,替换我们覆盖onActivityResult
方法中onAddMateriaClicked
方法中的代码:
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
方法:
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
。
确保将要传递的任何数据作为参数添加到onAddMateriaClicked
项目。