我无法使用或了解如何从后台堆栈中弹出FragmentTransactions来处理自定义动画.具体来说,我希望它能够调用"out"动画,但似乎并没有.
我有一个简单的方法来处理片段事务(FragmentTransaction),我在其中添加片段并应用自定义转换以使其淡入/淡出.我还将此添加到后台堆栈,以便用户可以使用后退按钮撤消该事务,实际上导航到添加片段之前的状态.
protected void changeFragment() {
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
ft.add(R.id.fragment_container, new TestFragment());
ft.addToBackStack(null);
ft.commit();
}
Run Code Online (Sandbox Code Playgroud)
一切都很好地向前发展,但当用户点击后退按钮时,过渡动画不会反转.我所期待的是当片段被删除时,它将使用淡出动画.相反它似乎弹出(没有动画),然后容器似乎淡入.我不确定这是发生了什么,但片段绝对不会淡出.
我的应用程序使用兼容性库来添加片段支持,但我认为这也适用于Honeycomb(android-11).有谁知道我在这里做错了什么,或者我只是期待太多?理想情况下,我想为片段设置动画,类似于Gmail(在Xoom上)通过单击消息然后使用后退按钮向后移动的方式.最好不必覆盖后退按钮功能并跟上我自己的片段状态,因为我可能有几个"交易",我想要退出,我不是重新发明轮子的粉丝.
Android开发者小组也问过:http://groups.google.com/group/android-developers/browse_thread/thread/1136a3a70fa0b6e9
animation android transactions transitions android-fragments
回答
我有一个RelativeLayout,我在动态添加视图,因为用户垂直或水平滚动.我已经推出了自己的ViewRecycler,因为可能有数千个视图可以构成可以滚动的整个视图,但我只能在任何时候显示30个左右.想一个日历的放大视图.
当我添加即将看到的视图时遇到性能问题,在RelativeLayout上调用onMeasure,级联到onMeasure,调用它的所有子视图.我已经计算了RelativeLayout有多大的计算大小,并在它的LayoutParameters上设置了它,因此测量ViewGroup不是必需的,也不是重新测量已经添加了最终大小的视图和新的添加的视图与这些视图无关.
演示问题的简单示例是向RelativeLayout添加/删除View并观察onMeasure被调用,尽管它不会影响RelativeLayout的大小或其他视图的位置.
main.xml中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/shell"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
MyActivity.java
public class MyActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup shell = (ViewGroup) findViewById(R.id.shell);
final RelativeLayout container = new RelativeLayout(this) {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.d("MyActvity", "onMeasure called on map");
}
};
container.setBackgroundColor(Color.rgb(255, 0, 0));
ViewGroup.LayoutParams containerParams = new ViewGroup.LayoutParams(300, 300);
final TextView childView = new TextView(this);
childView.setBackgroundColor(Color.rgb(0, 255, …Run Code Online (Sandbox Code Playgroud) 我将 AdManagerAdView 包装在 AndroidView 中,以便可以在 Jetpack Compose 中使用它。当我在 LazyColumn 中使用图像时,图像无法加载,并且 AdManagerAdView 尝试在可组合项出现在屏幕上之前加载图像。
如果我快速滚动到该元素,那么 LazyColumn 将其组合起来,并且在图像从广告服务器返回之前它就出现在屏幕上,它会按预期工作。
LazyColumn {
items(5) {
SomeOtherComposable(it)
}
item {
AndroidView(
modifier = Modifier
.width(300.dp)
.height(250.dp)
.background(Color.Green),
factory = { context ->
val adView = AdManagerAdView(context)
adView.adSize = AdSize.MEDIUM_RECTANGLE
adView.adUnitId = adUnitId
adView.loadAd(Builder().build())
adView
}
)
}
items(5) {
SomeOtherComposable(it)
}
}
Run Code Online (Sandbox Code Playgroud)
出于演示目的...
@Composable
fun SomeOtherComposable(i: Int) {
Text(
text = "SomeOtherComposable $i",
modifier = Modifier
.fillMaxWidth()
.height(320.dp)
.background(Color.White)
)
}
Run Code Online (Sandbox Code Playgroud)
如果在非延迟列或任何其他 Compose 布局中使用包装的 AdManagerAdView,这也可以正常工作。
This …
adview android-jetpack-compose android-jetpack-compose-list lazycolumn
android ×2
adview ×1
android-jetpack-compose-list ×1
animation ×1
layout ×1
lazycolumn ×1
transactions ×1
transitions ×1
viewgroup ×1