如何在转换后重置 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();
}
}
}
我已经在资源中创建了一个转换管理器,并且 运行 当我的主布局上的一个按钮被点击时创建一个转换。这个想法非常简单:运行 过渡从资源膨胀并在单击登录按钮时过渡到 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();
}
}
}