2017-02-21 8 views
1

enter image description hereфрагмента доступа переменные за пределы фрагмента в виде пейджере

Перед чтения вопроса, пожалуйста, обратитесь к изображению.

Я использую viewpager для отображения фрагмента.

Проблема

В фрагменте, я использовал два EditText позволяет говорить editText1, editText2 теперь проблема в том, как я буду получать данные EditText. Я могу получить значения editText, когда пользователь нажимает следующую кнопку, но следующая кнопка находится за пределами фрагмента. Как получить доступ к редактору текста вне фрагмента.

Прежде чем опробовать вопрос, сообщите мне причину, чтобы я мог улучшить свой вопрос.

Фрагмент Java класс

// newInstance constructor for creating fragment with arguments 
     public static BpDetails newInstance(int page) { 
      BpDetails fragmentFirst = new BpDetails(); 
      Bundle args = new Bundle(); 
      args.putInt("someInt", page); 
      fragmentFirst.setArguments(args); 
      return fragmentFirst; 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      page = getArguments().getInt("someInt", 0); 
     } 


     // Inflate the view for the fragment based on layout XML 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      final View view = inflater.inflate(R.layout.bp_details, container, false); 

      Log.i("View ",view.toString()); 

      Log.i("DOB is ",Long.toString(Constants.dob)); 


      systolic =(EditText) view.findViewById(R.id.systolic); 
      diastolic =(EditText) view.findViewById(R.id.diastolic); 


      return view; 
     } 

ViewPager активность

vpPager = (ViewPager) findViewById(R.id.view_pager); 

     adapterViewPager = new MyPagerAdapter(getSupportFragmentManager()); 
     vpPager.setAdapter(adapterViewPager); 

     Fragment fragment=adapterViewPager.getItem(prevPage); 

     if (fragment.getClass().equals(BpDetails.class)){ 
      Log.i("Call ","Yes"); 
     } 

     findViewById(R.id.btn_prev).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       // checking for last page 
       // if last page home screen will be launched 
       int current = getItem(-1); 
       if (current!=0) 
        prevPage=current-1; 
       if (current < 4) { 
        // move to next screen 
        vpPager.setCurrentItem(current); 
       } else { 
        //final reached. 
       } 

      } 
     }); 

     findViewById(R.id.btn_next).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // checking for last page 
       // if last page home screen will be launched 
       int current = getItem(+1); 



       if (current!=0) 
        prevPage=current-1; 

       System.out.println("Prev page "+prevPage); 

       if (current < 4) { 
        // move to next screen 

        Fragment prevFragment=adapterViewPager.getItem(prevPage); 


       } else { 

        //final reached. 
       } 
      } 
     }); 


    } 

    private int getItem(int i) { 
     return vpPager.getCurrentItem() + i; 
    } 


    public static class MyPagerAdapter extends FragmentPagerAdapter { 
     private static int NUM_ITEMS = 4; 
     private static int mSelectedPosition; 

     public MyPagerAdapter(FragmentManager fragmentManager) { 
      super(fragmentManager); 
      //mSelectedPosition=selectedPosition; 
     } 

     // Returns total number of pages 
     @Override 
     public int getCount() { 
      return NUM_ITEMS; 
     } 

     // Returns the fragment to display for that page 
     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: // Fragment # 0 - This will show FirstFragment 
        return BasicDetails.newInstance(0); 
       case 1: 
        return BpDetails.newInstance(1); 
       case 2: 
        return BslDetails.newInstance(2); 
       case 3: 
        return Summary.newInstance(3); 

       default: 
        return null; 
      } 
     } 


    } 
+0

Делитесь своим кодом. –

+0

^. Как вы реализуете «ViewPager» –

+0

@an_droid_dev, общий код. –

ответ

0

Создайте два добытчиками внутри фрагмента, как это.

public String getSystolic(){ 

    return this.systolic.getText().toString(); 

    } 

public String getDiastolic(){ 

    return this.diastolic.getText().toString(); 
    } 



    BpDetails fr = (BpDetails)myAdapter.getItem(myViewPager.getCurrentItem()); 
    String systolicString = fr.getSystolic(); 
+0

java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.text.Editable android.widget.EditText.getText()' для ссылки на нулевой объект - это ошибка, которую я получаю.Я вызываю BpDetails fr = (BpDetails) myAdapter.getItem (myViewPager.getCurrentItem()); Строка systolicString = fr.getSystolic(); это, щелкнуть дальше следующий кнопка. –

+0

@AnkurKhandelwal поставил точку останова в метод onCreateView или журнал и посмотрел, является ли ваш EditText нулевым –

+0

Я поместил лог-фрагмент, edittext не равен нулю. –

0

У меня была аналогичная проблема. .getItem() создает экземпляр нового Fragment, поэтому при вызове myAdapter.getItem(...) вы получите значение null для всех элементов в Fragment, но не для Fragment.

Когда я установил это, что я должен был сделать создать еще один метод внутри MyPagerAdapter называется getInstantiatedFragment:

public Fragment getInstantiatedFragment(int position) 
    { 
     return fragments.get(position); 
    } 

fragments новое поле для класса:

private ArrayList<Fragment> fragments = new ArrayList<>(); 

Я бы переопределить getItem() (как вы уже это сделали) и изменить его на:

@Override 
    public Fragment getItem(int position) 
    { 
     switch (position) { 
      case 0: 
       BasicDetails basicDetails = BasicDetails.newInstance(0); 
       fragments.add(basicDetails); 
       return basicDetails; 
      ... 
    } 

где вы добавляете фрагмент в fragments до возвращения, то вы могли бы назвать:

BpDetails fr = (BpDetails)myAdapter.getInstantiatedItem(myViewPager.getCurrentItem()); 

, чтобы получить экземпляр созданного фрагмента, а затем вызвать

String systolicString = fr.getSystolic();

если вы» используя метод предыдущего ответа.

Это так, что вы можете отслеживать инстанцированные фрагменты в fragments. Я уверен, что есть лучшие способы.

+0

Вы не должны этого делать, потому что будете хранить ссылки на экземпляры фрагментов. Кроме того, 'FragmentPagerAdapter' уже кэширует« Фрагменты »для вас. 'get (int position)' только вызывается в случае, если фрагмент не найден в кеше. – jpact

+0

Я согласен, однако 'getItem (...)' никогда не получит экземпляр 'Fragment' для меня, он всегда будет создавать новый. Похоже, что это абстрактный метод в [FragmentPagerAdapter] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/support/v4/ app/FragmentPagerAdapter.java), поэтому это объясняет, почему каждый раз создается экземпляр нового «Фрагмента», нет? –

+0

Хорошо, если вы посмотрите на реализацию «FragmentPagerAdapter», вы увидите, что во время создания экземпляров элементов вызывается 'getItem (...)'. Однако, прежде чем он будет вызван, FPA пытается найти такой фрагмент в своем «кеше» с помощью 'findFragmentByTag', и только если результат равен« null », то ваша ответственность - предоставить новый экземпляр такого фрагмента. Следовательно, 'getItem' не будет вызван при повороте устройства, например, – jpact

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