Локальная переменная в классе Fragment
У меня есть фрагмент, где я хочу отобразить значения из списка, так что я получаю это как в Activity Recipe Detail
IngredientsFragment ingredientsFrag = new IngredientsFragment();
ingredientsFrag.setPosition(position);
ingredientsFrag.setRecipes(MainActivity.receipes);
getSupportFragmentManager().beginTransaction()
.replace(R.id.FRGingredients, ingredientsFrag)
.commit();
Главное, на что стоит обратить внимание - это метод SetRecipes(), который я передаю в List, это статический список в классе MainActivity.
Во фрагменте "Ингредиенты" есть фрагмент " Ингредиент":
public class IngredientsFragment extends Fragment {
int position;
List<Recipe> mRecipes;
String test;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.frag_recipe_ingredients, container, false);
TextView ingredients = rootView.findViewById(R.id.ingredientsTxt);
ingredients.setText(String.valueOf(mRecipes.get(0).getName()));
return rootView;
}
public void setPosition(int position) {
this.position = position;
}
public void setRecipes(List<Recipe> recipes) {
test = String.valueOf(recipes.get(0).getName());
mRecipes = recipes;
}
}
Когда я запускаю этот код, это то, что я получаю:
11-10 23:14:17.682 2812-2812/com.lemuel.lemubit.bakenow E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.lemuel.lemubit.bakenow, PID: 2812
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lemuel.lemubit.bakenow/com.lemuel.lemubit.bakenow.RecipeDetail}: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2583)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2665)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1499)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5765)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class fragment
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:289)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
at com.lemuel.lemubit.bakenow.RecipeDetail.onCreate(RecipeDetail.java:15)
at android.app.Activity.performCreate(Activity.java:6360)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2530)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2665)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1499)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5765)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:289)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
at com.lemuel.lemubit.bakenow.RecipeDetail.onCreate(RecipeDetail.java:15)
at android.app.Activity.performCreate(Activity.java:6360)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2530)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2665)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1499)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5765)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference
at com.lemuel.lemubit.bakenow.Fragments.IngredientsFragment.onCreateView(IngredientsFragment.java:34)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2239)
at android.support.v4.app.FragmentManagerImpl.ensureInflatedFragmentView(FragmentManager.java:1507)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1303)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1502)
at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1737)
at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3512)
at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120)
at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:330)
at android.support.v4.app.BaseFragmentActivityApi14.onCreateView(BaseFragmentActivityApi14.java:39)
at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:75)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:754)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:289)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
at com.lemuel.lemubit.bakenow.RecipeDetail.onCreate(RecipeDetail.java:15)
at android.app.Activity.performCreate(Activity.java:6360)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2530)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2665)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1499)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5765)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Поэтому он не распознает переменную mRecipes, но меня озадачивает то, что когда я использую тест переменной, он просыпается, что означает, что список фактически передается в методе, но каждый раз, когда я пытаюсь получить к нему доступ в onCreateView, он говорит мне, что нулевая ошибка Хотя я могу получить доступ к тесту, если я изменю его на
ingredients.setText(test);
Это работает, когда я делаю это так, что означает, что OnCreateView видит переменную test, это также означает, что список, переданный в метод, изначально не был нулевым.
2 ответа
Это не то, как вы передаете массив или любую другую переменную в этом отношении фрагменту из действия. Вы должны передать пакет, содержащий ваш массив, в ваш фрагмент с помощью:
Bundle bundle = new Bundle();
bundle.putStringArrayList("edttext", arraylist);
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
IngredientsFragment ingredientsFrag = new IngredientsFragment();
ingredientsFrag.setArguments(bundle);
getSupportFragmentManager().beginTransaction()
.replace(R.id.FRGingredients, ingredientsFrag)
.commit();
Убедитесь, что ваш рецепт POJO реализует Parcelable.
Вызывается: java.lang.NullPointerException: попытка вызвать метод интерфейса 'java.lang.Object java.util.List.get(int)' для ссылки на пустой объект в com.lemuel.lemubit.bakenow.Fragments.IngredientsFragment.onCreateView(IngredientsFragment.java:34)
исключение ясно NullPointerException при доступе к списку. Вы должны поместить свой список в Bundle и установить его в качестве аргументов для своего фрагмента.. затем в классе фрагмента вы можете получить этот пакет из своего фрагмента в методе onCreateView.