从任何 activity 打开侧边栏应用程序启动器
Open Side bar app launcher from any activity
我是 Android 开发的新手。我正在创建一个示例启动器应用程序来替换 android 默认启动器。我创建了这个启动器。但我面临几个问题:
1. 点击 Apps 按钮,我会显示设备上安装的所有应用程序。但是应用程序图标的大小不同。我尝试为它们设置最大高度和宽度,但问题仍然存在。
2. 此发射器还包括侧边栏。如果我在主屏幕上,我可以从左向右滑动以获取此侧边栏。但是,当我点击应用程序按钮时,它会启动新的 activity 以显示设备上安装的应用程序,现在如果我尝试在此屏幕上返回侧边栏,它将不起作用。这意味着,侧边栏与主屏幕相关联。如何使它可以从任何地方访问,从应用列表屏幕或任何其他应用屏幕。
我想这些都是常见问题,但我在 google 上找不到这方面的帮助。有人可以帮忙吗?
谢谢,
凯拉斯
我终于解决了这个问题。
应用程序图标大小
- 在定义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"
边栏:我不确定这样做是黑客还是正确的方法。我遵循了这种方法:
我使用 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);
这符合我的预期。但我仍然不确定正确的解决方案。如果您有任何更好的方法,请告诉我。谢谢!!
我是 Android 开发的新手。我正在创建一个示例启动器应用程序来替换 android 默认启动器。我创建了这个启动器。但我面临几个问题: 1. 点击 Apps 按钮,我会显示设备上安装的所有应用程序。但是应用程序图标的大小不同。我尝试为它们设置最大高度和宽度,但问题仍然存在。 2. 此发射器还包括侧边栏。如果我在主屏幕上,我可以从左向右滑动以获取此侧边栏。但是,当我点击应用程序按钮时,它会启动新的 activity 以显示设备上安装的应用程序,现在如果我尝试在此屏幕上返回侧边栏,它将不起作用。这意味着,侧边栏与主屏幕相关联。如何使它可以从任何地方访问,从应用列表屏幕或任何其他应用屏幕。
我想这些都是常见问题,但我在 google 上找不到这方面的帮助。有人可以帮忙吗?
谢谢, 凯拉斯
我终于解决了这个问题。
应用程序图标大小
- 在定义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"
边栏:我不确定这样做是黑客还是正确的方法。我遵循了这种方法: 我使用 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);
这符合我的预期。但我仍然不确定正确的解决方案。如果您有任何更好的方法,请告诉我。谢谢!!