我正试图用导航抽屉活动恢复我的应用程序,但在使用简单活动的旧版本中,我有一些对话框,可以从用户那里获取数据,并在活动中对其进行管理。
现在我有了一些片段,通过从用户那里取回数据,我遇到了一些问题。
我的第一个问题是:MainActivity包含4个片段,其中一个有很多按钮,在XML中使用onClick方法。所有的活动都可以正常工作,但对于片段,我不能声明onClick xml的方法!
第二个问题是onClick方法使用startActivityForResult调用DialogActivity,并使用onActivityResult收回数据。我将onClick方法移动到包含片段的MainActivity中,但当它使用startActivityForResult启动对话框时,不会调用片段中的onActivityResult。
我试图将其移动到活动中,并将接收到的数据传递给带有接口的片段,但我在函数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" />
的方法onASE
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和方法、片段和方法之间的通信,我就在这里!
将所有内容添加到主活动:
在片段的xml中调用的方法,如果按下startActivityForResult按钮从用户获取数据。
之后,我在main活动中写入onActivityResult,当返回数据时,将其保存到DB中,并修改片段中按钮的样式。
包含碎片的主要活动
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;
}
这个问题被问了很多次,活动和片段之间的通信可以通过很多方式完成,比如在捆绑包中传递数据,按照这里解释单例模式,以及使用EventBus。看到这个答案,我已经解释了每个方面,你可以如何做,如果你想要更多的理解,那么就评论它。
官方医生来了
我需要通过单击片段xml文件上的按钮来打开一个新活动。 XML 爪哇
和logcat:
我试图从碎片屏幕调用一个活动中的方法。 我有一个名为myMethod()的方法,它位于名为MyActivity的活动中;我有一个片段叫做Screen1Fragment。 我想给我的活动打电话。从Screen1Fragment内部创建myMethod(),但我不确定如何执行此操作。 以前,Screen1Fragment是一个活动,因此我扩展了MyActivity,以便可以直接调用myMethod()
我合并了一个水平幻灯片导航组件(这需要使类扩展片段)。滑动部分工作正常。这里我有相应的<code>onClick() 到目前为止,我的代码还不多,所以我不会用相关的布局部分来混淆我的问题。任何帮助都是非常感谢的。 片段#1的Java代码 public class TasksFragment扩展Fragment { @ Override public View oncreate View(layou
我在处理活动和碎片时遇到了一些麻烦。我正处于应用程序开发的早期阶段,最终希望设计一种最有效的方法来整合两个独立的屏幕。 每种方法的好处是什么?你会选择哪种设计?
这个问题多半是征求意见,对我的APP最好的处理方式。我有三个碎片被一个活动处理。片段A有一个可点击的元素照片,片段B有4个可点击的元素按钮。另一个片段只是在照片被点击时显示细节。我在用ActionBarsherlock。 前进和后退按钮需要将照片分别改为下一个或上一个姿势。我可以把照片和按钮放在同一个片段中,但我想把它们分开,以防我想在平板电脑中重新排列它们。 我需要一些建议--我应该把片段A和B