从任何 activity 打开侧边栏应用程序启动器

Open Side bar app launcher from any activity

我是 Android 开发的新手。我正在创建一个示例启动器应用程序来替换 android 默认启动器。我创建了这个启动器。但我面临几个问题: 1. 点击 Apps 按钮,我会显示设备上安装的所有应用程序。但是应用程序图标的大小不同。我尝试为它们设置最大高度和宽度,但问题仍然存在。 2. 此发射器还包括侧边栏。如果我在主屏幕上,我可以从左向右滑动以获取此侧边栏。但是,当我点击应用程序按钮时,它会启动新的 activity 以显示设备上安装的应用程序,现在如果我尝试在此屏幕上返回侧边栏,它将不起作用。这意味着,侧边栏与主屏幕相关联。如何使它可以从任何地方访问,从应用列表屏幕或任何其他应用屏幕。

我想这些都是常见问题,但我在 google 上找不到这方面的帮助。有人可以帮忙吗?

谢谢, 凯拉斯

我终于解决了这个问题。

  1. 应用程序图标大小

    • 在定义ImageView的xml中,指定layout_width和layout_height为app_icon_size。

    ImageView android:id="@+id/item_app_icon" android:layout_width="@android:dimen/app_icon_size" android:layout_height="@android:dimen/app_icon_size" android:layout_alignParentLeft="true"

  2. 边栏:我不确定这样做是黑客还是正确的方法。我遵循了这种方法: 我使用 window 管理器来托管侧边栏布局。并使用 window 布局参数来保持此 window 将始终位于任何其他应用程序的顶部。 Sidebar layout 只不过是一个 Drawing Layout 来滑入和滑出,默认是这个布局。

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
           // Shrink the window to wrap the content rather than filling the screen
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            // Display it on top of other application windows, but only for the current user
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            // Dont let it grab input focus
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            // Make underlying application window visible through any transparent parts
            PixelFormat.TRANSLUCENT
    ); drawingLayout = (CustomDrawerLayout) inflater.inflate(R.layout.activity_sidebar, null);
    listView = (ListView) drawingLayout.findViewById(R.id.left_drawer);
    drawingLayout.setDrawerShadow(R.mipmap.drawer_shadow, GravityCompat.START);
    drawingLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            WindowManager.LayoutParams newParams = new WindowManager.LayoutParams();
            newParams.copyFrom(params);
            newParams.width = 150;
            windowManager.updateViewLayout(drawingLayout, newParams);
        }
    
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                windowManager.updateViewLayout(drawingLayout, params);
            }
    
        });
    
        loadApps(((View) drawingLayout).getContext());
        loadListView(((View) drawingLayout).getContext());
        addClickListener(((View) drawingLayout).getContext());
        windowManager.addView(drawingLayout, params);
    

这符合我的预期。但我仍然不确定正确的解决方案。如果您有任何更好的方法,请告诉我。谢谢!!