2013-12-12 5 views
1

У меня есть 2 фрагмента (вкладки), которые делят некоторые данные. Когда вы меняете данные, я бы хотел, чтобы это отразилось на другой вкладке. Я исследовал это на stackOverflow, и я думаю, что соответствующий ответ связан с вызовом .notifyDataSetChanged(), но я не могу заставить его работать. Вот соответствующий код ...Refresh Fragment Views on on Button Button

public class EnterCourseData extends FragmentActivity implements ActionBar.TabListener { 

private ViewPager viewPager; 
private TabsPagerAdapter mAdapter; 
private ActionBar actionBar; 
// Tab titles 
private String[] tabs = { "Pars", "Handicaps" }; 
private int courseNumber, teeNumber; 
private Tee tee; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_enter_tees); 
    // Initilization 
    Intent mIntent = getIntent(); 
    courseNumber = mIntent.getIntExtra("courseNumber",0); 
    Course course = Global.getCourse(courseNumber); 
    teeNumber = mIntent.getIntExtra("teeNumber",0); 
    tee = course.getTee(teeNumber); 

    viewPager = (ViewPager) findViewById(R.id.pager); 
    actionBar = getActionBar(); 
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager(), courseNumber, teeNumber); 

    viewPager.setAdapter(mAdapter); 
    actionBar.setHomeButtonEnabled(false); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);   

    // Adding Tabs 
    for (String tab_name : tabs) { 
     actionBar.addTab(actionBar.newTab().setText(tab_name) 
       .setTabListener(this)); 
    } 
    /** 
    * on swiping the viewpager make respective tab selected 
    * */ 
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int position) { 
      // on changing the page 
      // make respected tab selected 
      actionBar.setSelectedNavigationItem(position); 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 
} 

и дальше, вот метод OnClick, который требует обновления ...

public void savePars(View view){ 
    tee.setSlope(Integer.parseInt(((EditText) findViewById(R.id.enter_tee_slope)).getText().toString())); 
    tee.setRating(Double.parseDouble(((EditText) findViewById(R.id.enter_tee_rating)).getText().toString())); 
    mAdapter.notifyDataSetChanged(); 
} 

Вот TabsPagerAdapter ...

public class TabsPagerAdapter extends FragmentPagerAdapter { 
int courseNumber, teeNumber; 

public TabsPagerAdapter(FragmentManager fm, int courseNumber, int teeNumber) { 
    super(fm); 
    this.courseNumber = courseNumber; 
    this.teeNumber = teeNumber; 
} 

@Override 
public Fragment getItem(int index) { 

    switch (index) { 
    case 0: 
     // Par Entry activity 
     Fragment parFragment = new ParFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ParFragment.ARG_COURSE_NUMBER, courseNumber); 
     args.putInt(ParFragment.ARG_TEE_NUMBER, teeNumber); 
     parFragment.setArguments(args); 
     return parFragment; 
    case 1: 
     // Handicap Entry fragment activity 
     Fragment hcpFragment = new HandicapFragment(); 
     args = new Bundle(); 
     args.putInt(HandicapFragment.ARG_COURSE_NUMBER, courseNumber); 
     args.putInt(HandicapFragment.ARG_TEE_NUMBER, teeNumber); 
     hcpFragment.setArguments(args); 
     return hcpFragment; 
    } 

    return null; 
} 

@Override 
public int getCount() { 
    // get item count - equal to number of tabs 
    return 2; 
} 

}

Отделано одним фрагментом ...

public class ParFragment extends Fragment { 
    public static final String ARG_COURSE_NUMBER = "courseNumber", ARG_TEE_NUMBER = "teeNumber"; 

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

     View rootView = inflater.inflate(R.layout.fragment_par, container, false); 
     Bundle args = getArguments(); 
     Course course = Global.getCourse(args.getInt(ARG_COURSE_NUMBER)); 
     ((TextView) rootView.findViewById(R.id.display_course_name)).setText(course.getName()); 
     Tee tee = course.getTee(args.getInt(ARG_TEE_NUMBER)); 
     ((TextView) rootView.findViewById(R.id.display_tee_name)).setText(tee.getTeeName()); 
     ((TextView) rootView.findViewById(R.id.enter_tee_slope)).setText(Integer.toString(tee.getSlope())); 
     ((TextView) rootView.findViewById(R.id.enter_tee_rating)).setText(Double.toString(tee.getRating())); 

     return rootView; 
    } 
} 

А вот другой ...

public class HandicapFragment extends Fragment { 
    public static final String ARG_COURSE_NUMBER = "courseNumber", ARG_TEE_NUMBER = "teeNumber"; 


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

     View rootView = inflater.inflate(R.layout.fragment_handicap, container, false); 
     Bundle args = getArguments(); 
     Course course = Global.getCourse(args.getInt(ARG_COURSE_NUMBER)); 
     ((TextView) rootView.findViewById(R.id.display_course_name)).setText(course.getName()); 
     Tee tee = course.getTee(args.getInt(ARG_TEE_NUMBER)); 
     ((TextView) rootView.findViewById(R.id.display_tee_name)).setText(tee.getTeeName()); 
     ((TextView) rootView.findViewById(R.id.enter_tee_slope)).setText(Integer.toString(tee.getSlope())); 
     ((TextView) rootView.findViewById(R.id.enter_tee_rating)).setText(Double.toString(tee.getRating())); 

     return rootView; 
    } 

} 

Когда кнопка нажата, я хочу, чтобы сохранить эти значения, и я хочу, чтобы эти значения, чтобы показать другой фрагмент.

Помогите noob.

Благодаря

+0

Где ваша кнопка на самом деле? В первом фрагменте или во втором фрагменте или в активности? –

+0

Оба фрагмента. Фактически оба фрагмента показывают данные в одинаковых представлениях «EditText», и оба фрагмента имеют одинаковые обработчики кнопок.(есть и некоторые фрагментированные данные, также отображаемые и введенные, но я оставил это из этого слишком длинного вопроса.) – ddk

ответ

2

Вам необходимо обмениваться данными между фрагментами, но фрагмент не может напрямую взаимодействовать с другим фрагментом, все сообщение должно выполняться посредством действия, которое содержит эти фрагменты.

шаги, чтобы следовать являются:

  • Определить интерфейс во фрагменте, где вы реализовали onClickListener (пусть это будет фрагмент A)

  • Реализация интерфейса в деятельности, которая удерживает их фрагменты

  • В переопределенном методе извлечение экземпляра фрагмента из адаптера viewpager и доведение сообщения до фрагмента B путем вызова его общедоступных методов.


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

Для получения более подробной информации о Общаясь с другими фрагментами, refer here

+0

Это меня так близко ... но. Я выбираю кнопку щелчка в фрагменте 'ParFragment', и я уведомляю об активности холдинга. Я получаю метод в холдинговой деятельности, который уведомляется фрагментом. Теперь я хочу получить доступ к методам в двух фрагментах вкладки из активности холдинга. 'ParFragment parFrag = (ParFragment) getSupportFragmentManager(). FindFragmentById (R.id.fragment_par);' возвращает нулевое значение. Я определяю '@ + id/fragment_par' в заголовке' fragment_par' xml. Как получить правильное значение фрагмента, чтобы получить доступ к mtehod во фрагменте? – ddk

+0

Получил окончательный ответ из другого сообщения. Per @Rafa, 'FragmentStatePagerAdapter' не использует теги при добавлении фрагментов в Activity. Я использовал 'ParFragment parFrag = (ParFragment) mAdapter.instantiateItem (viewPager, 0)', и все это сработало. - Благодаря. – ddk

0

Так есть трюк: просто пусть фрагменты имеют ссылку на объект друг друга и вызвать функцию у другого, чтобы загрузить данные при обращении с onClickListener кнопки. например:

protected void onClickListener(View view) { 
    if (view == myButton) { 
     // Do other stuffs here 
     fragment1.reloadData(); 
    } 
} 

P/S: Я повторно пост это как ответ, чтобы иметь форматирования кода.

+0

Что вы подразумеваете под «ссылкой на объект»? Как получить ссылку на объект для фрагмента? Вы хотите вызвать onCreateView или поместить кишки onCreateView в метод и вызвать это из фрагмента OnCreateView и из onClickListener кнопки? – ddk

+0

Нет, я имел в виду, что: public class Fragment1 extends Fragment { private Fragment2 фрагмент2; public Fragment2 getFragment2() { return fragment2; } public void setFragment2 (фрагмент фрагмента2) { this.fragment2 = фрагмент2; }} Так fragment1 иметь ссылку на FRAGMENT2, так что вы можете вызвать общественные функции в FRAGMENT2 от внутри fragment1 ... и одинаково для FRAGMENT2, который держит ссылку из fragment1 ... –

+0

Но где _fragment2_ когда-нибудь получаешь ценность? Если я использую ваш пример и пытаюсь ссылаться на 'fragment2.refreshFragment1();', я получаю ошибку во время выполнения, потому что _fragment2_ никогда не инициализируется указателем на фактический объект _fragment2_ и поэтому является Null. – ddk