Android 5.0 列表动画
Android 5.0 List Animation
我有一个由 View
和 TextView
组成的项目列表。我定义了一个动画:
View mView = findViewById(R.id.view);
Intent detailIntent = new Intent(this, DetailActivity.class);
String transitionName = getString(R.string.my_transition);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
mView, transitionName);
startActivity(detailIntent, options.toBundle());
在我的 list_item.xml 中我有:
<View
android:id="@+id/view"
android:layout_width="@dimen/list_dimen"
android:layout_height="match_parent"
android:layout_marginStart="0dp"
android:background="@color/accent"
android:transitionName="@string/my_transition"/>
第一个项目的过渡效果很好,但无论我单击列表中的哪个项目,动画总是来自第一个项目,如果我滚动到第一个项目不在视图中的位置当我点击一个项目时,应用程序强制关闭。如何将动画附加到特定列表项?
解决方案:
根据 MarcaoAS 的回答,我必须将视图附加到特定的根视图。我正在实现一个 Master-Detail
关系,所以我的列表有一个 Fragment
,其中包含一个 Callbacks
:
public interface Callbacks {
public void onItemSelected(String id);
}
我不得不对其进行编辑以将 View
作为参数而不是 String
:onItemSelected(View view)
。
同样,我必须在引用的地方进行此更改。生成 Fragment
时(我在 Android Studio
中创建项目时选择了 Master-Detail),onListItemClick
被覆盖:
@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
mCallbacks.onItemSelected(view);
}
如您所见,我再次将 id
替换为传入的 view
。
在我的 ListActivity
中,我在上面发布了我的原始代码,现在我有:
@Override
public void onItemSelected(View view) {
//tablet
if (mTwoPane) {
//tablet handling
}
//phone
else {
View mView = view.findViewById(R.id.view);
Intent detailIntent = new Intent(this, DetailActivity.class);
String transitionName = getString(R.string.my_transition);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
mView, transitionName);
startActivity(detailIntent, options.toBundle());
}
}
再次从Fragment
class传入View
。这解决了我的问题。
确保下面的代码是return项目视图。
View mView = findViewById(R.id.view);
如果您从 activity 调用它,它将始终 return 第一个项目,因为您的项目可能具有相同的 ID。尝试在您的 onClick 方法中这样做:
public void onClick(View v) {
View mView = v.findViewById(R.id.view);
Intent detailIntent = new Intent(this, DetailActivity.class);
String transitionName = getString(R.string.my_transition);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mView, transitionName);
startActivity(detailIntent, options.toBundle());
}
我有一个由 View
和 TextView
组成的项目列表。我定义了一个动画:
View mView = findViewById(R.id.view);
Intent detailIntent = new Intent(this, DetailActivity.class);
String transitionName = getString(R.string.my_transition);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
mView, transitionName);
startActivity(detailIntent, options.toBundle());
在我的 list_item.xml 中我有:
<View
android:id="@+id/view"
android:layout_width="@dimen/list_dimen"
android:layout_height="match_parent"
android:layout_marginStart="0dp"
android:background="@color/accent"
android:transitionName="@string/my_transition"/>
第一个项目的过渡效果很好,但无论我单击列表中的哪个项目,动画总是来自第一个项目,如果我滚动到第一个项目不在视图中的位置当我点击一个项目时,应用程序强制关闭。如何将动画附加到特定列表项?
解决方案:
根据 MarcaoAS 的回答,我必须将视图附加到特定的根视图。我正在实现一个 Master-Detail
关系,所以我的列表有一个 Fragment
,其中包含一个 Callbacks
:
public interface Callbacks {
public void onItemSelected(String id);
}
我不得不对其进行编辑以将 View
作为参数而不是 String
:onItemSelected(View view)
。
同样,我必须在引用的地方进行此更改。生成 Fragment
时(我在 Android Studio
中创建项目时选择了 Master-Detail),onListItemClick
被覆盖:
@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
mCallbacks.onItemSelected(view);
}
如您所见,我再次将 id
替换为传入的 view
。
在我的 ListActivity
中,我在上面发布了我的原始代码,现在我有:
@Override
public void onItemSelected(View view) {
//tablet
if (mTwoPane) {
//tablet handling
}
//phone
else {
View mView = view.findViewById(R.id.view);
Intent detailIntent = new Intent(this, DetailActivity.class);
String transitionName = getString(R.string.my_transition);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
mView, transitionName);
startActivity(detailIntent, options.toBundle());
}
}
再次从Fragment
class传入View
。这解决了我的问题。
确保下面的代码是return项目视图。
View mView = findViewById(R.id.view);
如果您从 activity 调用它,它将始终 return 第一个项目,因为您的项目可能具有相同的 ID。尝试在您的 onClick 方法中这样做:
public void onClick(View v) {
View mView = v.findViewById(R.id.view);
Intent detailIntent = new Intent(this, DetailActivity.class);
String transitionName = getString(R.string.my_transition);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mView, transitionName);
startActivity(detailIntent, options.toBundle());
}