android “setOnClickListener”方法对“setContentView”设置的自定义布局文件无效

ruoxqz4g  于 2023-05-27  发布在  Android
关注(0)|答案(1)|浏览(173)

OnClickListener不支持使用setContentView自定义导入视图

android应用程序有activity和activit_layout。然后我在activity_layout上放置了三个按钮,并为每个按钮设置了“onclicklistener”,以便打开不同的自定义视图。每个按钮都使用“onclicklistener”方法中的“setContentView”方法为Activity设置特定的布局文件,并且它们工作得很好。然后,这些每个自定义布局上都有sperate textview。一旦agian,我想设置“setOnClickListener”为这些每个textviews是自定义布局文件,separatelty和执行不同的任务。问题是当我点击文本视图时,什么也没有发生。我不知道天气文本被识别或“onclicklistener”方法不起作用。我在下面附上我的代码文件。
活动java文件:-

public class beverbs extends AppCompatActivity
{
    private int layout = 0; // interger for custom layout file
    TextView text1;  // textview is on the custom layoutfile
    View view1;   // custom Layout file

    @SuppressLint("InflateParams")
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);

        view1 = LayoutInflater.from(getBaseContext()).inflate(R.layout.custome_layout,null);

        text1 = view1.findViewById(R.id.textView12);

        text1.setOnClickListener(new OnClickListener()   // this part does not work
        {
            @Override
            public void onClick(View view)
            {
                // do something
            }
        });

    }

    public void open_new_layout(View view)  // onclick methode  
    {
        layout = 1;
        setContentView(R.layout.custome_layout);  // button on main layout set  custom layout the activity 
    }

    @Override
    public void onBackPressed()
    {
        if (layout==1)
        {
            layout = 0;
            setContentView(R.layout.activity_layout);  // set original layout again
        }
        else
        {
            super.onBackPressed();
        }
    }
}

活动XML文件:-

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="open_new_layout"
        android:text="Open Layout"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

自定义布局XML文件:-

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView12"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Perform Task"
        android:textSize="34sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

请任何人帮助我与这种天气有另一种方式来完成我的任务。
我在互联网上寻找任何解决方案,但没有得到任何关于这一点。

gmxoilav

gmxoilav1#

您正在膨胀一个布局(custome_layout.xml)并在其TextView上设置一个点击侦听器,但实际上并没有显示膨胀的布局-因此用户无法点击它!
我猜你实际上想在activity_layout中的Button上设置点击监听器:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // inflate and display the main activity layout
    setContentView(R.layout.activity_layout);

    // find the button on the displayed layout
    Button button = findViewById(R.id.button5);
    
    // set a click listener on it
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            // call openNewLayout or whatever
        }
    };
}

这里的一个问题是,您使用的是带有布局资源ID的setContentView,如setContentView(R.layout.activity_layout)。这将获取XML文件,* 膨胀 * 其布局(即创建XML文件中描述的View对象并将它们连接起来),最后显示View对象的最终层次结构。
当您找到button并在其上设置单击侦听器时,* 您将其设置在特定的View对象上 *。如果你再次调用setContentView(R.layout.activity_layout)(就像在你的'back'函数中一样),那么 * 它会膨胀一组新的View对象 *。ID为button5Button在您重新设置它之前不会设置单击侦听器,因为它是一个全新的对象。
你有两个选择。您可以手动地扩展每个视图层次结构并存储它们(就像您在onCreate中对R.layout.custome_layout所做的那样),然后调用setContentView(view1)等,即传递 * 一组Views用于显示 *。这样,由于您使用的是相同的对象,因此仍然会设置任何单击侦听器。
另一个选择是做你正在做的事情,调用setContentView(R.layout.activity_layout),但是每次调用它时都运行你的设置代码(添加点击监听器等)--你正在膨胀新的对象,所以每次都需要设置它们。最简单的方法是创建一个像showMainLayout()这样的方法,它有setContentViewsetOnClickListener代码,当你想显示这个布局时调用它。
或者你可以使用Fragment s,然后在它们之间进行交换--这类东西是它们的主要用途。

相关问题