在 Android 中使用片段时处理后按

     2023-04-13     87

关键词:

【中文标题】在 Android 中使用片段时处理后按【英文标题】:Handling back press when using fragments in Android 【发布时间】:2014-04-28 11:28:14 【问题描述】:

我在我的应用程序中使用带有导航抽屉的 Android 滑动菜单,并且在应用程序中使用片段而不是活动。 当我打开抽屉时,单击一个出现片段的项目。我使用以下代码从一个片段移动到另一个片段:

Fragment fragment = null;
fragment = new GalleryFragment(selectetdMainMenu.getCategoryID());
                    FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.addToBackStack("menuFrag");
                    ft.add(R.id.frame_container, fragment, "menuFrag");
                    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                    ft.commit();

通过这种方式,我可以从一个片段转到另一个片段,但在按下后退按钮时我无法到达前一个片段。我设法想出了这段代码来处理初始化抽屉的 MainActivity 中的后按:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
    super.onKeyDown(keyCode, event);
    if (keyCode == KeyEvent.KEYCODE_BACK) 
        Fragment fragment_byTag = fragmentManager.findFragmentByTag("menuFrag");
        Fragment menuFragment_by_tag = fragmentManager.findFragmentByTag("galleryFrag");
        Fragment commentsFrag_by_tag = fragmentManager.findFragmentByTag("commentsFrag");
        Fragment dealDetail = fragmentManager.findFragmentByTag("promoFrag");
            if(commentsFrag_by_tag != null)
                if (commentsFrag_by_tag.isVisible()) 
                    Log.e("comments back  ", " clicked");
                    //menuDetailsFrag.onBackPressed();
                    FragmentManager fragmentManager = getSupportFragmentManager();
                    fragmentManager.beginTransaction().remove(commentsFrag_by_tag).commit();
                    fragmentManager.beginTransaction().show(menuFragment_by_tag).commit();
                
            else if(menuFragment_by_tag.isVisible())
                Log.e("menu back  ", " clicked");
                menuDetailsFrag.onBackPressed();
                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager.beginTransaction().remove(menuFragment_by_tag).commit();
                fragmentManager.beginTransaction().show(fragment_byTag).commit();
            
        



    return false;

这有时有效,但大部分时间都失败了。如果可以显示更好的导航方式,我将不胜感激。

【问题讨论】:

看看这个 .. ***.com/questions/22552653/… add this ft.addToBackStack(null);ft.commit(); 将片段添加到后台堆栈并弹出它们。 ***.com/questions/22550420/… @Raghunandan。我找到的最简单的解决方案是你的。 我知道这篇文章很旧,但请看我的回答:***.com/a/45430033/3999826 【参考方案1】:

我通常将onKeyListener 设置为onResume 中的View。据我所知,您必须注意在View 上设置setFocusableInTouchMode()requestFocus

这是我用于此目的的示例:

@Override
public void onResume() 

    super.onResume();

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() 
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) 

            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK)

                // handle back button

                return true;

            

            return false;
        
    );

【讨论】:

我在哪里放置此代码?片段或主要活动> 这行得通。我添加了 getActivity().getSupportFragmentManager().popBackStack();处理后按。 onresume 中有 keyevent 的原因是什么? @super-qua,片段的绝佳解决方案 如果您在片段中有一个可以获得焦点的子视图,这将停止工作。例如,如果您在片段中有“列表状态”和“编辑状态”,则进入其中包含EditText 的“编辑状态”,选择EditText,主视图将失去焦点并且onKey() 将停止运行,除非您手动重新获得基本视图的焦点。【参考方案2】:

试试这些方法。对我来说,最有用的解决方案如下:

在 MainActivity 中:

getSupportFragmentManager().beginTransaction().replace(R.id.gif_contents, gifPageTwoFragment, "gifPageTwoFragment").addToBackStack("gifPageTwoFragment").commit();

在 GifPageTwoFragment 中:

@Override
    public void onActivityCreated(Bundle savedInstanceState) 
        super.onActivityCreated(savedInstanceState);
        getView().setFocusableInTouchMode(true);
        getView().requestFocus();
        getView().setOnKeyListener(new View.OnKeyListener() 
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) 
                if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) 
                    Log.e("gif--","fragment back key is clicked");
                    getActivity().getSupportFragmentManager().popBackStack("gifPageTwoFragment", FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    return true;
                
                return false;
            
        );
    

【讨论】:

【参考方案3】:

在您的 oncreateView() 方法中,您需要编写此代码,在 KEYCODE_BACk 条件下,您可以编写任何您想要的功能

   View v = inflater.inflate(R.layout.xyz, container, false);
    //Back pressed Logic for fragment
    v.setFocusableInTouchMode(true);
    v.requestFocus();
    v.setOnKeyListener(new View.OnKeyListener() 
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) 
            if (event.getAction() == KeyEvent.ACTION_DOWN) 
                if (keyCode == KeyEvent.KEYCODE_BACK) 
                    getActivity().finish();
                    Intent intent = new Intent(getActivity(), MainActivity.class);
                    startActivity(intent);

                    return true;
                
            
            return false;
        
    );

【讨论】:

这对我来说是完美的【参考方案4】:
        view.setFocusableInTouchMode(true);
        view.requestFocus();
        view.setOnKeyListener(new View.OnKeyListener() 
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event)   
        if (keyCode == KeyEvent.KEYCODE_BACK) 


            Fragment NameofFragment = new NameofFragment;

            FragmentTransaction  transaction=getFragmentManager().beginTransaction();
            transaction.replace(R.id.frame_container,NameofFragment);

            transaction.commit();

            return true;
        
        return false;
    
);

return view;

【讨论】:

【参考方案5】:

使用这个(在 kotlin 中)

activity?.onBackPressedDispatcher?.addCallback(this, object : OnBackPressedCallback(true) 
    override fun handleOnBackPressed() 
        // in here you can do logic when backPress is clicked
    
)

我认为这是最优雅的方式

【讨论】:

处理仅在单击时更新 UI 数据的活动的后按?

...布时间】:2018-11-1809:26:57【问题描述】:我正在开发一个Android应用程序,在该应用程序中,我只在点击活动时更新UI。我正在显示一个项目列表..点击我检查它has_child列表与否....如果true我在同一个活动中再次加载该子列表。我... 查看详情

Android:返回到上一个片段后按

】Android:返回到上一个片段后按【英文标题】:Android:Returntopreviousfragmentonbackpress【发布时间】:2014-10-1014:30:33【问题描述】:我已经实现了导航抽屉,它是Activity的子类。我的应用程序中有很多片段。我的问题在这里假设有3个... 查看详情

使用选项卡活动和片段时如何处理后按

】使用选项卡活动和片段时如何处理后按【英文标题】:Howtohandlethebackpressedwhileusingtabactivityandfragment【发布时间】:2018-05-1401:27:03【问题描述】:我正在使用activtity,它由fragmentA放置。fragmentA包含3个选项卡tabA、tabB和tabC在应用... 查看详情

在listview中使用意图时如何在android中处理NullPointerException?

】在listview中使用意图时如何在android中处理NullPointerException?【英文标题】:HowtohandleNullPointerExceptioninandroidwhileusingintentsinlistview?【发布时间】:2015-08-1106:21:48【问题描述】:我的布局由一个edittext和listview组成。单击一个listitem... 查看详情

android中常见的线程池(代码片段)

Android中常见的线程池Executors在Android中什么场景下使用Executors是Java平台的一个工具类,提供了方便的线程池管理功能,可以帮助开发者更加便捷地管理线程。在Android开发中,Executors经常被用于异步处理任务,特别是在处理IO操作... 查看详情

在片段的后按防止使用导航图调用前一个片段的 onViewCreated

】在片段的后按防止使用导航图调用前一个片段的onViewCreated【英文标题】:OnbackpressoffragmentpreventtocallonViewCreatedofpreviousfragmentusingnavigationgraph【发布时间】:2019-06-1419:38:12【问题描述】:我正在使用喷气背包导航在片段之间导航... 查看详情

如何在android中使用底部导航视图时恢复片段状态?

】如何在android中使用底部导航视图时恢复片段状态?【英文标题】:Howtorestorefragmentstateswhileusingbottomnavigationviewinandroid?【发布时间】:2019-12-0214:51:55【问题描述】:我正在尝试从android底部导航视图中的第二个片段返回时恢复片... 查看详情

Android Studio片段没有响应后按按钮

】AndroidStudio片段没有响应后按按钮【英文标题】:Androidstudiofragmentnotrespondingtobackpressedbutton【发布时间】:2020-04-1212:21:11【问题描述】:我的应用中只有一个活动和很多片段一切正常,我将此代码添加到我的loginFragment@Overridepubli... 查看详情

Android:在drawerlayout中使用地图膨胀片段时出错

】Android:在drawerlayout中使用地图膨胀片段时出错【英文标题】:Android:Errorinflatingfragmentwithmapindrawerlayout【发布时间】:2015-07-1712:01:56【问题描述】:我的应用程序在抽屉布局的第二个菜单中有地图。当我尝试使用地图为片段充... 查看详情

在 Android 中使用 ChildFragmentManager 时片段替换​​不起作用

】在Android中使用ChildFragmentManager时片段替换​​不起作用【英文标题】:FragmentreplacenotworkingwhenusingChildFragmentManagerinAndroid【发布时间】:2013-07-0620:28:46【问题描述】:我想将一个片段作为子添加到另一个片段我正在使用ChildFragmen... 查看详情

android编译时注解处理apt(代码片段)

一、注解在使用Java语言开发的过程中,我们会经常看到各种各样的注解,@Override(表示方法的重写),@Deprecated(标记过时的元素方法,类或属性),@LayoutRes(表示的是布局资源),@IdRes(表示的是ID资源),@Drawa... 查看详情

android编译时注解处理apt(代码片段)

一、注解在使用Java语言开发的过程中,我们会经常看到各种各样的注解,@Override(表示方法的重写),@Deprecated(标记过时的元素方法,类或属性),@LayoutRes(表示的是布局资源),@IdRes(表示的是ID资源),@Drawa... 查看详情

text在android中使用placeautocompletebuilder时出错的说明(代码片段)

查看详情

当我们在android中使用backstack返回上一个片段时,上一个片段正在重新启动

】当我们在android中使用backstack返回上一个片段时,上一个片段正在重新启动【英文标题】:Previousfragmentisrestartingwhenwegobacktopreviousfragmentusingbackstackinandroid【发布时间】:2020-11-1711:03:31【问题描述】:假设我们有两个片段,我们... 查看详情

Native Android App中的颤振,后按不起作用

】NativeAndroidApp中的颤振,后按不起作用【英文标题】:FlutterinNativeAndroidApp,backpressednotworking【发布时间】:2020-12-0713:57:54【问题描述】:我阅读了很多关于此的主题,但没有任何效果,并且与我的上下文完全相同。我正在尝试在... 查看详情

Android 在 Vulkan 中失去焦点处理

】Android在Vulkan中失去焦点处理【英文标题】:AndroidlostfocushandlinginVulkan【发布时间】:2017-05-0206:11:56【问题描述】:我在Android中使用Vulkan,每当我触摸Overviewbutton(方形的那个)并返回我的应用程序时,它都会崩溃。失败的解决... 查看详情

在android中处理超过3MP的图像

】在android中处理超过3MP的图像【英文标题】:Processmorethan3MPimageinandroid【发布时间】:2012-03-1609:46:37【问题描述】:我想处理(裁剪)分辨率超过3MP的图像。任何人都可以在不使用BitmapFactory.Options.inSampleSize的情况下帮助解决此... 查看详情

后按后更新导航抽屉的选定状态

...kpress【发布时间】:2015-03-0515:41:22【问题描述】:按下后处理导航抽屉的选定状态的正确方法是什么?我有一个导航抽屉,其中包含n个条目(在列表视图中),例如AndroidStudio中的SDK示例。当我单击导航抽屉条目时,我希望将它... 查看详情