覆盖片段中的后退按钮

Posted

技术标签:

【中文标题】覆盖片段中的后退按钮【英文标题】:overriding back button in fragment 【发布时间】:2013-04-21 16:11:45 【问题描述】:

我在选项卡选择中有一个包含不同片段的活动,我想覆盖后退按钮,以便它调用片段中的一个方法,将列表视图更新为父文件夹列表。 现在我已经在主要活动中做了这个:

    @Override
        public void onBackPressed()
        
            ActionBar actionbar = getActionBar();
            if(actionbar.getSelectedTab().getPosition() == 0)
            
                if(!fla.onBackPressed())
                    super.onBackPressed();
            
        

片段中的这个:

   public boolean onBackPressed()
    
        if(back_str.equals(MAIN_POINT))
            Log.v("A", "BACK FIRST" + back_str);
            return false;
            
        else
        
            Log.v("A", "BACK PREMUTO");
            updateListViewFolder(back_str);
            return true;  //torna indietro nella view
        
    

back_str 是类中的全局字符串,引用列表视图中的当前父目录,每次打开文件夹时都会更新。

似乎当我按下后退按钮时,back_str 总是 = null

有人可以帮助我并告诉我解决此问题的方法吗?

编辑:

我会尝试更好地解释我,我在片段中有一个列表视图,用于导航到手机的文件夹,从 /storage/ 开始,当我按下文件夹时,它会打开更新调用此方法的列表视图:

public void updateListViewFolder(String newPath)

    ArrayList<Song> songsListTMP = new SongManager().getPlayList(newPath); //aggiungo tutte le canzoni
    songsListData.removeAll(songsListData);

    //AGGIUNGO LA CARTELLA PRECEDENTE
    File here = new File(newPath);
    back_str = here.getParent();
    Log.v("A", "S:"+back_str);
    Song back = new Song(back_str, true); //Sono directory
    songsListData.add(back);

    for(int i = 0; i < songsListTMP.size(); i++)
    
        Song song = songsListTMP.get(i);
        songsListData.add(song); //tengo un attimo separate
    

        for(File dir : here.listFiles() )
        
            if(dir.isDirectory() && dir.canRead())
                Song sdir = new Song(dir.getPath(), true); //Sono directory
                songsListData.add(sdir);
            
        

    getListView().invalidateViews();

    

现在,如果选择了后退按钮,我想返回到父文件夹,但是当我尝试从活动中调用片段的 onBackPressed 方法时,我得到了错误。我正在使用静态变量 string_str 将要更新列表的父文件夹的路径存储在我的片段中,但不知何故我无法使用相同的 updateListViewFolder 方法更新列表

【问题讨论】:

back_str是如何初始化的? 根据您提供的信息很少,如果您将 back_str 作为参数传递给函数以对其进行修改,这在 java 中将不起作用。改为使用公共 void 方法来设置值。 back_str 初始化为全局变量,等于“/storage/”。问题仍然不在于我如何传递变量,因为永远不会调用 else 子句。在活动中,当我调用片段的方法(onBackPressed)时,它总是返回“/storage/”而不是另一个路径,因为当我打开另一个文件夹时应该修改 back_str 【参考方案1】:

好的,我发现了错误。 我没有在操作栏选项卡中调用片段实例的方法,我只是在调用该类的方法。 我让我的班级 MyTabListener 为我的片段设置一个标签,以便我可以访问它 (FolderListActivity) getFragmentManager().findFragmentByTag("F1");

这里是类:

class MyTabListener implements ActionBar.TabListener 
    private Fragment mFragment;

    public MyTabListener(Fragment fragment) 
        mFragment = fragment;
    

    public void onTabSelected(Tab tab, FragmentTransaction ft) 
        if(mFragment instanceof FolderListActivity)
            ft.add(mFragment, "F1"); //mi occupo di settare un tag per recuperare la specifica istanza del fragment
        else
            ft.add(mFragment, "F0");
    

    public void onTabUnselected(Tab tab, FragmentTransaction ft) 
        FolderListActivity f1 = (FolderListActivity) getFragmentManager().findFragmentByTag("F1"); //accedo allo specifico fragment
        if(f1 != null)
            f1.cleanView();
        ft.remove(mFragment);
    

    public void onTabReselected(Tab tab, FragmentTransaction ft) 
        // do nothing
    

【讨论】:

以上是关于覆盖片段中的后退按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖android中的操作栏后退按钮?

覆盖 UINavigationController 中的后退按钮

覆盖Angular中的浏览器“后退”按钮功能?

如何在flutter中停用或覆盖appBar中的箭头后退按钮?

如何在不覆盖自然后退按钮的情况下添加左栏按钮?

如何覆盖 Flutter 中的“返回”按钮? [复制]