2

У меня есть viewpager, в котором размещены несколько фрагментов. Один из них, Frag1, должен получить объект с данными и заполнить некоторые EditText этими данными.fragment.getview() возвращающий null из активности

Дело в том, что когда я пытаюсь получить доступ к фрагменту из активности, getView() всегда возвращает null, что делает невозможным вызов методов класса Frag1. Я использую LogCat, чтобы проверить, являются ли другие переменные нулевыми, но кажется, что проблема исходит из проверки getView().

Любая идея, почему это null?

код активности

(...) 

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_form1); 

     mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager()); 

     final ActionBar actionBar = getActionBar(); 

     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setDisplayShowTitleEnabled(false); 

     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mAppSectionsPagerAdapter); 
     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       // When swiping between different app sections, select the corresponding tab. 
       // We can also use ActionBar.Tab#select() to do this if we have a reference to the 
       // Tab. 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

public static class AppSectionsPagerAdapter extends FragmentPagerAdapter { 

     public AppSectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int i) { 
      switch (i) { 
       case 0: 
        return new Frag1(); 

       case 1: 
        return new Frag2(); 

       case 2: 
        return new Frag1(); 

       case 3: 
        return new Frag1(); 

       default: 
        return new Frag1(); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 4; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return "Section " + (position + 1); 
     } 
    } 


    public void Populate(Patient patient) { 
     Frag1 fragment = 
        (Frag1) mAppSectionsPagerAdapter.getItem(0); 

     Log.d(patient.getName(), "data check"); 
     Log.d(fragment.hello(), "fragment check"); 

     if (fragment.getView() == null) { 
      Log.d("*** DEBUG ***", "found the problem champ"); 
     } 

       if(fragment != null) // could be null if not instantiated yet 
       { 
       if(fragment.getView() != null) 
       { 
        // no need to call if fragment's onDestroyView() 
        //has since been called. 
        fragment.setName(patient.getName()); 
        Log.d(patient.getName(), "supbrah");// do what updates are required 
       } 
       } 
    } 

Фрагмент кода

public class Frag1 extends Fragment { 

EditText name; 
Spinner spinner; 
AutoCompleteTextView textView; 
AutoCompleteTextView textView1; 
Spinner spinner1; 
AutoCompleteTextView textView2; 
View v; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    v = inflater.inflate(R.layout.activity_form, container, false); 

    name = (EditText) v.findViewById(R.id.name_edit); 

    return v; 
} 

public String hello() { 
    return "sup brah"; 
} 

public String getName() { 
    String patient = name.getText().toString(); 
    return patient; 
} 

public void setName(String text) { 
    name.setText(text, TextView.BufferType.EDITABLE); 
} 

} 

ответ

1

Попробуйте вызвать viewPager.getChildAt (целое х); вместо viewPagerAdapter.getItem (int x) .getView();

+0

У меня все еще проблема. В поле EditText ничего не отображается. setText по-прежнему не работает после того, как я его заменил. Вы имеете в виду замену fragment.getView()! = Null на viewPager.getChildAt (int x), правильно? – JZweige

5

Исправьте меня, если я ошибаюсь, но не следует ли использовать getView().findViewById(R.id.name_edit); и положить его в onViewCreated? То, как сейчас, не должно работать imo.

Вот некоторые samplecode:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    if (container == null) { 
     return null; 
    } 
    return inflater.inflate(R.layout.activity_form, container, false); 

} 
@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onViewCreated(view, savedInstanceState); 

name = (EditText) getView().findViewById(R.id.name_edit); 

} 

Надеется, что это помогает. :)

+0

Независимо от этого изменения, в коде операции getView() по-прежнему возвращает null ... Я думаю, это то, что мешает мне заставить setText работать. – JZweige

+0

Все ли ваш код в одном классе? – LordMarty

+0

Этот сегмент, который вы указали, изменил его в классе фрагментов. Но затем я пытаюсь вызвать метод из того же класса из активности (функция Populate), и он не работает, потому что getView возвращает null. – JZweige

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