Passage de paramètres à partir d'Android FragmentActivity de Fragment
Lorsque j'essaie de passer un paramètre à partir de FragmentActivity à un Fragment, il me donne l'exception de pointeur null dans la getArguments() dans le Fragment.
Voici mon FragmentActivity Code
public class IndexChartActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.index_chart);
IndexFragmentActivity indexFragment =
(IndexFragmentActivity)getSupportFragmentManager().findFragmentById(R.id.index_fragment);
indexFragment.newInstance("ASPI");
}
}
Ici est la index_chart.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:orientation="vertical" >
<fragment
android:id="@+id/header_fragment"
android:name="com.lk.ignitionit.cse.util.HeaderFragmentActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<fragment
android:id="@+id/index_fragment"
android:name="com.lk.ignitionit.cse.util.IndexFragmentActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<fragment
android:name="com.lk.ignitionit.cse.util.ChartFragmentActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
et Voici le Fragment
public class IndexFragmentActivity extends Fragment {
protected ImageView ivASPI;
protected ImageView ivMPI;
protected ImageView ivSP;
protected TextView tvMain;
protected TextView tvTop;
protected TextView tvBottom;
String response = null;
String result = null;
String [] resultArr = null;
Bundle b = new Bundle();
String indexType = null;
int layout;
IndexFragmentActivity f = null;
public IndexFragmentActivity newInstance(String index) {
f = new IndexFragmentActivity();
Bundle args = new Bundle();
args.putString("indextype", index);
f.setArguments(args);
return f;
}
public String getSelectedIndex() {
return f.getArguments().getString("indextype");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(getSelectedIndex().equals("ASPI")){
layout = R.layout.aspi_header;
}else if(getSelectedIndex().equals("MPI")){
layout = R.layout.mpi_header;
}else{
layout = R.layout.sp_header;
}
View view = inflater.inflate(layout, container, false);
tvMain = (TextView) view.findViewById(R.id.tv_main);
tvTop = (TextView) view.findViewById(R.id.tv_top);
tvBottom = (TextView) view.findViewById(R.id.tv_bottom);
new ServiceAccess().execute("");
tvMain.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
b.putString("type", "S&P SL20");
Activity activity = getActivity();
Intent intent = new Intent(activity, IndexChartActivity.class);
intent.putExtras(b);
startActivity(intent);
}
});
return view;
}
}
et Voici mon ERREUR
Caused by: java.lang.NullPointerException
at com.lk.ignitionit.cse.util.IndexFragmentActivity.getSelectedIndex(IndexFragmentActivity.java:69)
J'ai appelé beaucoup de stackoverflow des questions pertinentes pour cela et essayé l'exemple de code donné http://developer.android.com/guide/components/fragments.html. Mais toujours pas de chance
Vraiment apprécier tous les feed-back sur ce que cela semble être une question très fondamentale que je ne peux pas comprendre..
Merci d'Avance
OriginalL'auteur virtualpathum | 2012-10-13
Vous devez vous connecter pour publier un commentaire.
Se débarrasser de
Activity
à partir des noms de toutes les classes qui n'héritent pas deActivity
. Par exemple,IndexFragmentActivity
n'est pas unActivity
.Dans
onCreate()
de votre activité, vous appelezfindFragmentById()
pour récupérer un fragment, puis de l'appel d'newInstance()
sur ce fragment. Cependant, le fragment sera pas la première foisonCreate()
est appelé, et vous allez échouer ici avec unNullPointerException
. Veuillez gérer correctement ce cas.Le nom de la méthode
newInstance
en Java est le plus souvent associée avec le modèle de fabrique, oùnewInstance()
est unstatic
méthode utilisée à la place d'un constructeur public pour créer des instances d'une classe. VotrenewInstance()
méthode n'est passtatic
. Ce sera la cause de la confusion pour ceux qui viendront après vous, pour maintenir le code.Vous appelez
newInstance()
dansonCreate()
, créez un nouveau fragment de l'instance, puis le jeter, ce qui est une perte de temps.Donc, en supposant que votre instance d'origine de votre fragment (où il vient) n'a pas d'arguments
Bundle
ensemble, qui pourrait expliquer votreNullPointerException
dansgetSelectedIndex()
.Pour passer un paramètre à un nouvellement créé fragment, à l'aide d'un
static
newInstance()
méthode et les argumentsBundle
pour créer le nouveau fragment est parfaitement raisonnable.Pour passer un paramètre à un fragment qui existe déjà, il suffit de les appeler méthode de définition sur ce fragment.
OriginalL'auteur CommonsWare