以编程方式为场景中的按钮设置 onClickListeners
Setting onClickListeners for buttons in scenes programmatically
我有 2 个包含相同按钮的布局
layout_1.xml
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/button_1"
android:text="button2"
android:background="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
和
layout_2.xml
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/button_1"
android:text="button2"
android:background="@android:color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
请假设这些都是有效的布局等(我只是添加相关代码。)。
所以在我的片段中,我膨胀并在 onCreateView
中使用 layout_1.xml
。我想使用 button_1
在两个场景之间切换。
我可以在 onCreateView()
期间在 layout_1.xml
中设置 button_1
的监听器。
问题是试图在第二个 view.i.e 中的那个按钮上设置一个监听器。听众不会为第二个场景激活(layout_2.xml
)。因此我无法在 2 scenes.Is 之间切换有没有办法实现这个?
一般来说,拥有多个具有相同 id
的视图并不是一个好主意。这就是造成这里混乱的原因。
注意:以下是 OP 使用的适合其特定需求的解决方案:
一个简单的解决方案是使用 XML 文件中的 onClick
属性。您可以将相同的 onClick 方法分配给多个项目。像这样:
并在您的 activity.java 中添加:
public void buttonClicked(View v){
Log.d("TAG","Button clicked!!"
// do stuff here
}
第二个选项:
当您使用 button_1
的 id
为一个按钮设置侦听器时,它不会为两个按钮设置 listener
,它只会为第一个按钮设置。如果你想为两者设置相同的listener
,你需要做的就是将这些按钮分配为不同的ids
,然后将它们分配为相同的listener
。
这是你应该做的:
Listener myListener = new Listener(){.. blah blah....};
((Button) findViewById(R.id.some_id)).setListerner(myListener);
((Button) findViewById(R.id.some_other_id)).setListerner(myListener);
第三个选项:
findViewById(R.id.id_of_layout1).findViewById(R.id.button_1)
findViewById(R.id.id_of_layout2).findViewById(R.id.button_1)
在这种情况下,您需要在布局文件中添加一些 id,例如:layout_1.xml:
<RelativeLayout
android:id="+id/id_of_layout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/button_1"
android:text="button2"
android:background="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
实际上,执行此操作的正确方法是在第二个场景中定义要执行的动作:
mSecondScene.setEnterAction(new Runnable() {
@Override
public void run() {
((Button) mSecondScene.getSceneRoot().findViewById(R.id. button_1)).setOnClickListener( ... );
}
这将允许您在视图上设置 ClickListener,而无需将数据绑定到通用点击侦听器方法。然后你可以执行到第二个场景和中提琴的过渡。
我有 2 个包含相同按钮的布局
layout_1.xml
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/button_1"
android:text="button2"
android:background="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
和
layout_2.xml
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/button_1"
android:text="button2"
android:background="@android:color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
请假设这些都是有效的布局等(我只是添加相关代码。)。
所以在我的片段中,我膨胀并在 onCreateView
中使用 layout_1.xml
。我想使用 button_1
在两个场景之间切换。
我可以在 onCreateView()
期间在 layout_1.xml
中设置 button_1
的监听器。
问题是试图在第二个 view.i.e 中的那个按钮上设置一个监听器。听众不会为第二个场景激活(layout_2.xml
)。因此我无法在 2 scenes.Is 之间切换有没有办法实现这个?
一般来说,拥有多个具有相同 id
的视图并不是一个好主意。这就是造成这里混乱的原因。
注意:以下是 OP 使用的适合其特定需求的解决方案:
一个简单的解决方案是使用 XML 文件中的 onClick
属性。您可以将相同的 onClick 方法分配给多个项目。像这样:
并在您的 activity.java 中添加:
public void buttonClicked(View v){
Log.d("TAG","Button clicked!!"
// do stuff here
}
第二个选项:
当您使用 button_1
的 id
为一个按钮设置侦听器时,它不会为两个按钮设置 listener
,它只会为第一个按钮设置。如果你想为两者设置相同的listener
,你需要做的就是将这些按钮分配为不同的ids
,然后将它们分配为相同的listener
。
这是你应该做的:
Listener myListener = new Listener(){.. blah blah....};
((Button) findViewById(R.id.some_id)).setListerner(myListener);
((Button) findViewById(R.id.some_other_id)).setListerner(myListener);
第三个选项:
findViewById(R.id.id_of_layout1).findViewById(R.id.button_1)
findViewById(R.id.id_of_layout2).findViewById(R.id.button_1)
在这种情况下,您需要在布局文件中添加一些 id,例如:layout_1.xml:
<RelativeLayout
android:id="+id/id_of_layout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/button_1"
android:text="button2"
android:background="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
实际上,执行此操作的正确方法是在第二个场景中定义要执行的动作:
mSecondScene.setEnterAction(new Runnable() {
@Override
public void run() {
((Button) mSecondScene.getSceneRoot().findViewById(R.id. button_1)).setOnClickListener( ... );
}
这将允许您在视图上设置 ClickListener,而无需将数据绑定到通用点击侦听器方法。然后你可以执行到第二个场景和中提琴的过渡。