如何在按钮点击时刷新片段标签内容

10

我是Android领域的新手,正在实现一个小项目,其中我从一个Drupal网站获取新闻。这个应用程序有3个选项卡,每个选项卡都有一些具体内容的文章列表。文章列表是由线性布局中排列的文本视图和图像视图创建的。当我点击标题时,文章会以详细信息的形式打开。这些文章是通过HTTP POSTViewJSON模块从Drupal站点加载的。选项卡是使用FragmentActivityTabHost创建的。到这里为止一切都正常并且运行良好。

我的问题在于,我想要添加一个刷新按钮,放置在选项卡上,当我按下它时,文章列表必须刷新或重新加载,并保持当前选项卡打开。

我尝试替换选项卡片段的内容并重新打开它,但是当我点击一篇文章的标题以打开它时,选项卡的内容会保留在所有片段的堆栈下面。需要注意的是,当我点击文章的标题时,会打开一个新的片段。我将文章的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(); 
  }
});

提前感谢您的帮助!

2个回答

6

要刷新片段的内容,您可以保留对该片段的引用,并在该片段中调用一个公共(例如)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也可能正常工作。

3
您能详细说明一下“refresh”方法吗?我不太清楚它如何确切地刷新片段。 - ChuckKelly
1
你也可以通过以下方式访问当前片段: ((SectionsPagerAdapter)mViewPager.getAdapter()).getItem(mViewPager.getCurrentItem())) - ysldl
当按下“返回”并从后堆栈重新加载时,选项卡内容仍然为空,即无法正常工作。 - CodeMonkey
@YonatanNir 我不明白这与问题有什么关系,问题是关于刷新按钮的。 - NickL
想试着回答这个问题吗?http://stackoverflow.com/questions/30600634/viewpager-adapter-getitem-method-not-called-when-going-back-in-backstack - CodeMonkey
显示剩余3条评论

-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();
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接