2016-12-12 3 views
0

У меня есть MainActivity (распространяется Activity) и a FooFragment (распространяется Fragment).null ссылка на getArguments

активность использует newFooInstance метод для создания экземпляра FooFragment и установить некоторые аргументы ему:

public static FooFragment newInstance(String label) { 
    FooFragment fooFragment = new FooFragment(); 

    Bundle args = new Bundle(); 
    args.putString("fooLabel", label); 
    fooFragment.setArguments(args); 

    return fooFragment; 
} 

Теперь внутри FooFragment s onCreate и onCreateView я:

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    fooLabel = getArguments().getString("fooLabel"); // null error 
} 

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

    ViewGroup rootView = (ViewGroup) inflater.inflate(
      R.layout.fragment_balanse_period, container, false 
    ); 

    TextView fooView = (TextView) rootView.findViewById(R.id.fooLabel); 
    fooView.setText(fooLabel); 

    return rootView; 
} 

И он производит:

Попытка ссылаться на virt ual метод java.lang.String android.os.Bundle.getString(java.lang.String, java.lang.String) по ссылке на нулевой объект *

Любая идея, что я делаю неправильно?

EDIT:

Определение основной деятельности, как:

public class MainActivity extends AppCompatActivity { 

Тогда инстанцирован fooFragment как:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    fragments = new ArrayList<>(); 
    fragments.add(newInstance("bar")); 

    // Instantiate a ViewPager and PagerAdapter 
    mPager = (ViewPager) findViewById(R.id.pager); 
    mPagerAdapter = new FooPagerAdapter(getSupportFragmentManager(), fragments); 
+0

показать, как вы используете 'метод newInstance'. Я думаю, что вы создаете его, не используя этот метод. –

+0

@ h3d0, во-первых, если вы хотите использовать Fragment внутри действия, вам необходимо расширить FragmentActivity else AppCompatActivity. – TejaDroid

+0

Добавлена ​​дополнительная информация в соответствии с комментариями. – Oleg

ответ

0

Я нашел корень зла.

Внутри FooPagerAdaptergetItem было написано неверно.

Неправильно:

@Override 
public Fragment getItem(int position) { 
    return new FooFragment(); 
} 

Правильно:

@Override 
public Fragment getItem(int position) { 
    return fragments.get(position); 
} 
+1

Это именно то, о чем я говорил. Как я уже сказал, вы не используете фрагменты, созданные с помощью 'newInstance'. Чтобы избежать этого, сделайте свой конструктор фрагментов частным, и вы больше не сможете его использовать. –

Смежные вопросы