以编程方式为场景中的按钮设置 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_1id 为一个按钮设置侦听器时,它不会为两个按钮设置 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,而无需将数据绑定到通用点击侦听器方法。然后你可以执行到第二个场景和中提琴的过渡。