2015-05-16 2 views
1

Итак, я вернусь к обновлению содержимого EditText во Фрагменте из Activity. Мне нужно получить правый объект фрагмента из viewpager, используя его положение, однако метод, называемый drawSurname (surname), все еще дает мне ошибку «Can not resolve».Метод фрагмента недоступен из Activity

Релевантный код от FormActivity;

//initialise pager for swipe screens 
     ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
     adapter = new MyPagerAdapter(getSupportFragmentManager()); 
     pager.setAdapter(adapter); 

public void DrawText() { 
     // Fetching user details from sqlite 
     HashMap<String, String> user = db.getUserDetails(); 

     if (user.size() != 0) { 
      Log.e(TAG, "string surname: " + surname); 

      // Displaying the user details on the screen 
      Fragment n = adapter.getRegisteredFragment(0); 
      n.drawSurname(surname); 

     }else{ 
      Log.e(TAG, "table empty"); 
     } 
    } 

public class MyPagerAdapter extends FragmentStatePagerAdapter { 
     SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 

     public MyPagerAdapter(FragmentManager fm) { 

      super(fm); 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      switch(pos) { 

       case 0: return FirstFragment.newInstance("@string/form_instruct"); 
       case 1: return SecondFragment.newInstance("SecondFragment, Instance 1"); 
       case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1"); 
       case 3: return FourthFragment.newInstance("FourthFragment, Instance 1"); 
       //case 4: return FifthFragment.newInstance("ThirdFragment, Instance 3"); 
       default: return FirstFragment.newInstance("FirstFragment, Default"); 
      } 
     } 

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

     @Override 
     public Object instantiateItem(ViewGroup container, int position) { 
      Fragment fragment = (Fragment) super.instantiateItem(container, position); 
      registeredFragments.put(position, fragment); 
      return fragment; 
     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      registeredFragments.remove(position); 
      super.destroyItem(container, position, object); 
     } 

     public Fragment getRegisteredFragment(int position) { 
      return registeredFragments.get(position); 
     } 
    } 

FirstFragment.java

public class FirstFragment extends android.support.v4.app.Fragment { 

    //create variables & Logcat tag 
    private static final String TAG = FirstFragment.class.getSimpleName(); 
    private EditText inputTitle; 
    private EditText inputName; 
    private EditText inputSurname; 

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

     //set inputs for fields 
     inputTitle = (EditText) v.findViewById(R.id.titleText); 
     inputName = (EditText) v.findViewById(R.id.foreText); 
     inputSurname = (EditText) v.findViewById(R.id.surnameText); 

     TextView tv = (TextView) v.findViewById(R.id.tvFragFirst); 
     tv.setText(getArguments().getString("msg")); 

     inputSurname = (EditText) getActivity().findViewById(R.id.surnameText); 

     return v; 
    } 
    public static FirstFragment newInstance(String text) { 

     FirstFragment f = new FirstFragment(text); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 

    public void drawSurname(String x) { 

     inputSurname.setText(x); 
    } 
} 

Я был уверен, что я получил фрагмент правильно с getRegisteredFragment(), но не может понять, почему метод не назовешь иначе.

+2

Проблема возникает из-за того, что класс Fragment не должен иметь функцию drawSurname, но FirstFragment is. Чтобы решить эту проблему, создайте абстрактный класс, расширяющий фрагмент под названием SuperFrag, из которого наследуются все ваши пользовательские фрагменты. В SuperFrag добавьте функцию drawSurname. Вы можете переопределить его в своих наследующих классах. Наконец, SparseArray должен быть списком SuperFrag. – Dien

+1

@DAO, Ваш комментарий должен был быть ответом – Egor

ответ

3

Проблема возникает из-за того, что класс Фрагмента не должен иметь функцию drawSurname, но FirstFragment is. Чтобы решить эту проблему, создайте абстрактный класс, расширяющий фрагмент под названием SuperFrag, из которого наследуются все ваши пользовательские фрагменты. В SuperFrag добавьте функцию drawSurname. Вы можете переопределить его в своих наследующих классах. Наконец, SparseArray должен быть списком SuperFrag

+0

спасибо за помощь DAO. Если я буду исследовать вас дальше; Я создал SuperFrag extends Fragment. Я изменил FristFragment, поэтому он расширяет SuperFrag. Я добавил drawSurname() в SuperFrag. Я использовал @Override внутри FristFragment для drawSurname(). Все хорошо. Однако у меня все еще есть ошибка в FormActivity для n.drawSurname(). Это потому, что SparseArray должен быть списком в superFrag, чтобы позиции фрагментов оставались постоянными? Еще раз большое спасибо. – DarkMalice

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