【问题标题】:How to refresh fragment tab content on button click如何在按钮单击时刷新片段选项卡内容
【发布时间】:2026-02-22 01:00:03
【问题描述】:

我真的是 Android 新手,我正在实施一个小项目,其中我有来自一个 Drupal 网站的新闻。这个应用程序有 3 个标签,每个标签都有一个包含特定内容的文章列表。文章列表由以线性布局排列的 textviews 和 imageviews 创建。当我点击标题时,文章正在以详细信息打开。这些文章是通过 HTTP POST 和 ViewJSON 模块从 Drupal 站点加载的。选项卡是使用 FragmentActivity 和 TabHost 创建的。一切都很好,直到这里都可以正常工作。

我的问题是我想制作一个刷新按钮,放置在标签上,当我按下它时,文章列表必须刷新或重新加载并保持当前标签打开。 我试图替换标签片段内容并重新打开它,但是当我点击一篇文章的标题打开它时,标签内容保留在所有片段下的堆栈中。我提到当我点击文章标题时,会打开一个新片段。我发送了文章的 ID 作为参数,并在同一个片段中打开了文章的内容。

我正在尝试使用此代码,但没有成功。

Button btn_refresh = (Button) findViewById(R.id.btn_refresh);
        btn_refresh.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                 String current_tab = mTabHost.getCurrentTabTag(); 
                 if(current_tab.contains("POPULARE")){

                     Fragment f;
                     f = new PopulareActivity(); 
                     FragmentTransaction ft =   getSupportFragmentManager().beginTransaction(); 
                     ft.replace(R.id.tot,f);   
                     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
                     ft.commit();
               }
                 if(current_tab.contains("RECOMANDATE")){

                     Fragment f;
                     f = new RecomandateActivity(); 
                     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
                     ft.replace(R.id.tot,f);   
                     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
                     ft.commit(); 
                 } 

更确切地说,我在应用程序上输入,按 Tab2(显示来自 tab2 的文章列表),按刷新按钮,打开一篇文章,按移动设备的后退按钮并显示 tab2 的内容。现在,我在 tab1 上输入(并显示来自 tab1 的文章列表),从 tab1 列表中打开一篇文章,显示我需要的内容,然后在移动设备上按下后退按钮。此时显示的是 tab2 的内容(我按下刷新按钮的 tab2 中的文章列表。)。

要打开我使用的文章的详细信息:

           tv.setOnClickListener(new View.OnClickListener() { 
                    public void onClick(View v) { 

                             Fragment f;
                             f = new DetaliiActivity();
                             Bundle data = new Bundle();  
                             data.putInt("id", nid);
                             f.setArguments(data);
                             FragmentTransaction ft = getFragmentManager().beginTransaction();

                             ft.replace(R.id.tot,f);

                             ft.addToBackStack(null); 
                             ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
                             ft.commit(); 
                    }
                });

提前感谢您的帮助!

【问题讨论】:

    标签: android eclipse tabs android-fragments refresh


    【解决方案1】:
    FragmentTabHost tabHost3 = (FragmentTabHost) findViewById(android.R.id.tabhost);
    String current_tab = tabHost3.getCurrentTabTag();
    if (current_tab.equals("abc")) { 
        ClassFragment ni = (ClassFragment) getSupportFragmentManager().findFragmentByTag("abc");
        ni.refresh();
    }
    

    试试这个,选项卡下的所有内容都将再次执行。

    【讨论】:

      【解决方案2】:

      要刷新片段的内容,您可以保留对片段的引用,并在该片段中调用公共(例如)refresh() 方法。示例:

      public class ArticleTabFragmentActivity extends FragmentActivity{
        private PopulareFragment populareFragment;
        private RecomandateFragment recomandateFragment;
      
        <code>
      
        private void bindView(){
          Button btn_refresh = (Button) findViewById(R.id.btn_refresh);
      
          btn_refresh.setOnClickListener(new View.OnClickListener() {
      
                  public void onClick(View v) {
                       String current_tab = mTabHost.getCurrentTabTag(); 
                       if(current_tab.contains("POPULARE")){
                         populareFragment.refresh();
                       } else if(current_tab.contains("RECOMANDATE")){
                         recomandateFragment.refresh();
                       } 
          });
        }
      
      
      
      }
      
      public class PopulareFragment extends Fragment{  
      
        public void refresh(){
          <refresh the contents of the fragment>
        }
      
      }
      
      <Same for other fragment>
      

      现在,当您创建标签片段时,就像 PupulareFragment 一样,使用 pupulareFragment 实例变量来存储片段。所以在刷新按钮的onClick方法中是可用的。

      这样刷新时不会替换/创建任何新片段。因此,在进入文章详细信息活动后返回 tabActivity 可能也可以正常工作。

      【讨论】:

      • 你能详细说明一下刷新方法吗?我不清楚这会如何刷新片段
      • 刷新方法可以包含刷新片段中元素/数据等的函数。它实际上并没有对片段本身做任何事情,但不必重新创建它来更新其中的数据。
      • 也可以通过((SectionsPagerAdapter)mViewPager.getAdapter()).getItem(mViewPager.getCurrentItem()))访问当前片段
      • 不起作用。按下并从后台重新加载时,选项卡内容保持为空
      • @YonatanNir 我看不出这与刷新按钮有关的问题有什么关系。