如何在转换后重置 onClick 侦听器

How to reset onClick listeners after a transition

我已经在资源中创建了一个转换管理器,并且 运行 当我的主布局上的一个按钮被点击时创建一个转换。这个想法非常简单:运行 过渡从资源膨胀并在单击登录按钮时过渡到 scene_login,并且 运行 在单击注册按钮时过渡到 [=] 41=]。 单击后退按钮时,平滑地撤消转换,并准备好再次单击按钮上的事件。
布尔变量用于跟踪转换是否开始。 在转换 运行 之后,按钮不再接收 onClick 事件。这意味着我不能 运行 后续转换,这将在 onClick() 中 运行。以前从未遇到过这种情况。有什么想法吗?

R.transition.transition_mgr:

<?xml version="1.0" encoding="utf-8"?>
<transitionManager xmlns:android="http://schemas.android.com/apk/res/android">
  <transition android:transition="@transition/mytransitions"  android:toScene="@layout/scene_signup"/>
  <transition android:transition="@transition/mytransitions" android:toScene="@layout/scene_login"/>
  <transition android:transition="@transition/mytransitions" android:toScene="@layout/activity_main"/>
</transitionManager>

R.transition.mytransitions:

<?xml version="1.0" encoding="utf-8"?>

<transitionSet android:duration="3000"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <changeBounds/>
    <fade/>
</transitionSet>

R.layout.activity_main:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/signup"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="Sign Up"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/login"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="Log In"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline" />

    <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="0dp"
        app:layout_constraintGuide_percent=".5" />

</android.support.constraint.ConstraintLayout>

R.layout.scene_login:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/email"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="16dp"
        android:ems="10"
        android:hint="Email"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <EditText
        android:id="@+id/password"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:hint="Password"
        android:inputType="textPassword"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline" />

    <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="20dp"
        app:layout_constraintGuide_percent=".5" />

    <Button
        android:id="@+id/login"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="16dp"
        android:text="Log In"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/password" />

    <Button
        android:id="@+id/signup"
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="Sign Up"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/phone" />

</android.support.constraint.ConstraintLayout>

R.layout.scene_signup:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/login"
        android:layout_width="200dp"
        android:layout_height="0dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:text="Log In"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/phone" />

    <Button
        android:id="@+id/signup"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="Sign Up"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/phone" />

    <EditText
        android:id="@+id/password"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:hint="Password"
        android:inputType="textPassword"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/email" />

    <EditText
        android:id="@+id/confirmPassword"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:hint="Password (again)"
        android:inputType="textPassword"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/password" />

    <EditText
        android:id="@+id/email"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="100dp"
        android:ems="10"
        android:hint="Email"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/phone"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:hint="Phone"
        android:inputType="phone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/confirmPassword" />

</android.support.constraint.ConstraintLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity{

    private static final String TAG = "MainActivity";
    Button signupButton;
    Button loginButton;
    boolean transitionStarted = false;
    TransitionManager transitionMgr;
    Scene scene_main;
    Scene scene_login;
    Scene scene_signup;
    ViewGroup root;
    Context mContext = this;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        signupButton = findViewById(R.id.signup);
        loginButton = findViewById(R.id.login);


        root = findViewById(R.id.root);
        transitionMgr = TransitionInflater.from(mContext).inflateTransitionManager(R.transition.transition_mgr, root);
        scene_main = Scene.getSceneForLayout(root, R.layout.activity_main, mContext);
        scene_login = Scene.getSceneForLayout(root, R.layout.scene_login, mContext);
        scene_signup = Scene.getSceneForLayout(root, R.layout.scene_signup, mContext);

        signupButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d(TAG, "onClick: transitionStarted: " + transitionStarted );

                if(!transitionStarted) {
                    transitionMgr.transitionTo(scene_signup);
                    transitionStarted = true;
                }
            }
        });
        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d(TAG, "onClick: transitionStarted: " + transitionStarted);

                if(!transitionStarted) {
                    transitionMgr.transitionTo(scene_login);
                    transitionStarted = true;
                }
            }
        });





    }

    @Override
    public void onBackPressed() {
        Log.d(TAG, "onBackPressed: transitionStarted: " + transitionStarted);
        if(transitionStarted) {
            transitionStarted = false;
            transitionMgr.transitionTo(scene_main);
        }
        else
        super.onBackPressed();
    }

}

PS。似乎转移到一个新的场景,视图的信息包括任何onClick监听器都被清除了,我们可能需要重新找到视图并设置所需的监听器。

请注意,在转换到新场景后,视图信息(如 onClick 侦听器)将被清除,因为视图层次结构发生变化,尽管您可能会使用相同的 ID 创建不同的视图。
为了在转换后保持 onClick 工作,您需要再次找到相应的视图并重置它们的 onClick 侦听器。

修改后的 activity 代码(有效)(也在 GitHub 上):

class MainActivity : AppCompatActivity(), View.OnClickListener {
    override fun onClick(p0: View?) {
        when(p0?.id) {
            R.id.register -> {
                if (!animationStarted) {
                    TransitionManager.go(sceneRegister, set);
                    animationStarted = true;
                }
            }
            R.id.login -> {
                if(!animationStarted) {
                    TransitionManager.go(sceneLogin, set);
                    animationStarted = true;
                }
            }

        }

    }


    var animationStarted = false;

    lateinit var scene: Scene
    lateinit var login: Button
    lateinit var register: Button
    lateinit var root : ViewGroup
    lateinit var sceneRegister: Scene
    lateinit var sceneLogin: Scene
    lateinit var set: TransitionSet


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)
        login = findViewById<Button>(R.id.login);
        register = findViewById<Button>(R.id.register);
        root = findViewById<ViewGroup>(R.id.root);
        scene = Scene.getSceneForLayout(root, R.layout.main_activity, this);
        sceneLogin = Scene.getSceneForLayout(root, R.layout.main_activity_login, this);
        sceneRegister = Scene.getSceneForLayout(root, R.layout.main_activity_register, this);

        set = TransitionSet();

        set.addTransition(ChangeBounds()).addTransition(Fade()).addTransition(AutoTransition());

        login.setOnClickListener (this)
        register.setOnClickListener(this)




    }

    override fun onBackPressed() {
        if(animationStarted) {
            val root = findViewById<ViewGroup>(R.id.root);
            TransitionManager.go(scene, ChangeBounds() );
            animationStarted = false;
            login = findViewById(R.id.login)
            register = findViewById(R.id.register)

            login.setOnClickListener(this)
            register.setOnClickListener(this)
        }
        else {

            super.onBackPressed();
        }

    }
}