按下向上按钮时的自定义 Activity 转换

Posted

技术标签:

【中文标题】按下向上按钮时的自定义 Activity 转换【英文标题】:Custom Activity transition when up button is pressed 【发布时间】:2017-04-14 10:39:06 【问题描述】:

每当我从当前 activity 按下向上按钮时,父片段从右边缘向左滑动,这似乎是默认的过渡行为。但我希望父 Activity 滑动从左边缘向右。

我已经将onBackPressedoverridePendingTransition 和自定义转换xml 文件一起使用,但我的onBackPressed 从未被调用过。

这是我的 java 代码。

public class TakeOrderItems extends AppCompatActivity 

protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_take_order_items);

    //Get the actionbar to set the back button
    ActionBar ab = getSupportActionBar();
    ab.setDisplayHomeAsUpEnabled(true);

/* 
  CODE TO CREATE AND DISPLAY EXPANDABLELISTVIEW
                                               */


@Override
public void onBackPressed() 
    super.onBackPressed();
    Log.i("Good","back pressed");
    overridePendingTransition(R.transition.slide_in,R.transition.slide_out);

XML 转换文件

slide_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromXDelta="-100%"
    android:toXDelta="0"
    android:duration="200" />
</set>

slide_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromXDelta="0"
    android:toXDelta="100%"
    android:duration="200" />
</set>

我已经检查了很多答案,但它们似乎令人困惑和矛盾。我认为必须有一种优雅而有效的方法来实现这一点,因为许多应用程序都使用它。请帮助我。谢谢。

【问题讨论】:

你可以试试这个,@Override public boolean onKeyDown(int keyCode, KeyEvent event) if(event.getKeyCode()==KeyEvent.ACTION_DOWN) return super.onKeyDown(keyCode, event) ; @Vadivel 我不明白这段代码应该做什么。请你解释一下。 【参考方案1】:

overridePendingTransition 放在调用super.onBackPressed() 上面它必须工作

【讨论】:

【参考方案2】:

向上导航按钮由onOptionsItemSelected 处理。所以覆盖它:

@Override
public boolean onOptionsItemSelected(MenuItem item) 
    switch (item.getItemId()) 
        case android.R.id.home:
            finish();
            return true;
    

    return super.onOptionsItemSelected(item);

请注意,此onOptionsItemSelected 实现假定您的父活动已经启动,并且是您的后台堆栈中的下一个活动。除了完成当前的任务之外,您可能还需要启动它。

覆盖Activityfinish 方法以设置转换:

@Override
public void finish() 
    super.finish();
    overridePendingTransition(R.anim.slide_in, R.anim.slide_out);

此外,您似乎对 overridePendingTransition 方法名称感到困惑。它以 animations 作为参数,而不是 transitions

这将是您的 slide_in 等价物:

<set
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:shareInterpolator="false">

  <translate
    android:fromXDelta="-100%"
    android:toXDelta="0%"
    android:duration="200"/>

</set>

还有slide_out

<set
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:shareInterpolator="false">

  <translate
    android:fromXDelta="100%"
    android:toXDelta="200%"
    android:duration="200"/>

</set>

只需将这些文件放入res/anim 而不是res/transition

【讨论】:

你能解释一下,如何创建 anim.slide_in 吗? 谢谢。但也没有调用完成。我已经使用日志检查过。 哦,好吧,对不起,我忽略了你的问题。使用 Up 按钮确实不会调用finish()。我更新了处理 Up 案例的答案。 非常感谢。知道了。顺便说一句,我认为您输入的方法名称为 onUpdateItemSelected 而不是 onOptionsItemSelected。 好收获!我的复制/粘贴技能虐待了我 ;-) 已修复,谢谢。

以上是关于按下向上按钮时的自定义 Activity 转换的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 中滚动的自定义视图

确定在 Swift 的自定义 listView 单元格中按下了哪个按钮

Swift:当按下按钮时更改按钮样式并重设其他按钮

Facebook中的自定义动词

如何从 UITableViewCell 中的自定义 UIButton 中删除触摸延迟

Kivy:如何从自定义 BoxLayout 显示 ScrollView?