在Android中的多个活动中保持相同的背景,并将其从活动转换中排除

在Android中的多个活动中保持相同的背景,并将其从活动转换中排除,android,android-layout,android-manifest,Android,Android Layout,Android Manifest,我现在正在开发一个Android应用程序。基本上,我有多个视口翻转器,用于创建一组“面板”。例如,我有一个ViewFlipper来模拟主屏幕环境(可以通过向左或向右滑动来访问多个面板),还有一个不同的ViewFlipper来模拟应用程序启动器(用于收藏的应用程序、所有应用程序、设置等的面板)。我通过创建每套面板或其自身活动中的每个ViewFlipper来实现这一点,以便在不使用一套面板时保留内存 基本上,我希望在所有活动中保持相同的背景图像。现在,我知道这可以通过创建样式并将其应用于清单中的标记

我现在正在开发一个Android应用程序。基本上,我有多个视口翻转器,用于创建一组“面板”。例如,我有一个ViewFlipper来模拟主屏幕环境(可以通过向左或向右滑动来访问多个面板),还有一个不同的ViewFlipper来模拟应用程序启动器(用于收藏的应用程序、所有应用程序、设置等的面板)。我通过创建每套面板或其自身活动中的每个ViewFlipper来实现这一点,以便在不使用一套面板时保留内存

基本上,我希望在所有活动中保持相同的背景图像。现在,我知道这可以通过创建样式并将其应用于清单中的标记来实现,但我的问题是,背景图像包含在活动转换动画中(我自己的自定义动画已经设置,但不管是否使用库存转换动画,都会包含背景图像)

所以,我想问的是,有没有一种方法可以在多个活动之间保持一个通用的背景图像,而在活动之间切换时,这些图像不会被动画化

目前,我的样式xml文件如下所示:

<style name="Theme" parent="android:Theme">
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowBackground">@drawable/background_port</item> 
</style>

符合事实的
@可抽出式/背景\u端口

如你所见,所有活动的背景都设置了相同的drawable,但它包含在活动之间的过渡动画中,这是我不想要的。我也试过android:detachwallper=“true”,但在这种情况下似乎没用

我在Android代码方面相当有经验,所以不需要用简单的方式解释。如果我不明白什么,我会问的


谢谢你的帮助,非常感谢。

我认为没有一个简单的解决办法,但我过去做过的一些事情就是让类似的事情发生;我通过在startActivity之后调用类似overridePendingTransition(0,0)的东西删除了活动转换

然后,当活动即将更改时,我已在屏幕外手动设置视图元素的动画,然后在新活动中在屏幕上设置新视图元素的动画


另外,另一方面,如果您想要一个很好的easy panels type view组件,请查看SwipeView,不要使用活动。你只是把你想做的事情弄得非常复杂,试图把一个活动变成一个集成的活动。使用视图。你说你想使用活动来节省内存,但它们不会节省内存,而且在各个方面都比简单视图更重要。通过视图,您可以完全控制UI中的操作,这基本上就是您所要求的。如果您希望尽可能提高效率,请在显示视图时将您希望显示的视图放大,并删除视图层次结构中不再显示的旧部分,以便对其进行GCD。

旧问题,但以防其他人遇到此问题

虽然我同意hackbod的回答,但对于简单的用例,有一种方法可以在API 21中实现

活动1

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:id="@+id/activity_root"
  android:transitionName="activity_root"

  android:layout_width="match_parent"
  android:layout_height="match_parent"

  android:background="@drawable/main_bg"
  android:backgroundTint="#4d000000"
  android:backgroundTintMode="src_over"
  >

  <!-- Activity 1 stuff -->
</RelativeLayout>

活动2

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:id="@+id/activity_root"
  android:transitionName="activity_root"

  android:layout_width="match_parent"
  android:layout_height="match_parent"

  android:background="@drawable/main_bg"
  android:backgroundTint="#4d000000"
  android:backgroundTintMode="src_over"
  >

  <!-- Activity 2 stuff -->
</RelativeLayout>

然后,您可以开始第二项活动,如下所示:

Intent startIntent = new Intent(Activity1.this, Activity2.class);

Bundle b = ActivityOptionsCompat
  .makeSceneTransitionAnimation(Activity1.this,
    new Pair<>(findViewById(R.id.logo), "logo"), //Or whatever other elements you don't want moving around
    new Pair<>(findViewById(R.id.activity_root), "activity_root"))
  .toBundle();

startActivity(startIntent, b);
Intent startinent=新的Intent(Activity1.this,Activity2.class);
捆绑包b=活动选项兼容
.MakeScenetTransitionAnimation(活动1.this,
新的一对(findviewbyd(R.id.logo),“logo”),//或任何其他您不想移动的元素
新对(findViewById(R.id.activity\u root),“activity\u root”))
.toBundle();
startActivity(startinent,b);

谢谢您的回复。我想试试这个,但由于某些原因,在不使用WindowManager的情况下应用股票动画是很落后的。使用与overridePendingTransition()方法相同的动画可以生成相当平滑的过渡。不过我还是会去玩的。我喜欢你SwipeView的代码。请告诉我,如何向其中添加子视图?我是否使用include标记将其包含在xml文件中?是的,或者可以通过编程实现。看看这个示例应用程序:您认为它足够高效吗?我的意思是,上面的例子只是我程序中的两组面板。最后我会有很多面板。对不起,在膨胀和删除方面:如果我用xml指定我的视图,它们在setContentView()上不是自动膨胀的吗?当特定视图被膨胀和破坏时,我将如何选择?(我也会在这方面做家庭作业,但我想如果你能马上知道答案,会有帮助的)。谢谢。@Padie先生:“我最后会有很多面板”--然后应用你在
AdapterView
如何回收“面板”中看到的课程。“当特定视图被膨胀和破坏时,我将如何选择?”--您可以通过再次膨胀它们来控制它们膨胀的时间,方法是遵循您在
AdapterView
Adapter
中看到的模式。您不需要像Adapter/AdapterView那样复杂的东西。在视图层次结构中放置一个框架布局,将更改的内容放在其中。根据需要向其中添加视图。删除或隐藏旧视图。你的决定。隐藏更像是活动案例:旧的UI坐在那里不被看到,而是占用内存。如果你有很多不同的状态,移除它们更有意义,因为你可以释放内存。无论如何,如果不使用“活动”功能,试图将其作为不同的活动来实施,只会大大限制您的管理选项,而没有任何好处。@hackbod您是否仍然建议对此使用原始视图,而不是片段?什么是
R.id.logo
,我是否应该在此处传递图像?或者我可以删除它吗?是的,如果你想把场景转换的东西用于其他元素的话。您可以安全地删除它。这仅适用于api 21+@LeonardoSapuy Yup。我应该提到这一点。更新。