第二个按钮上的 OnClickListener 既没有正确初始化也没有按预期工作

Posted

技术标签:

【中文标题】第二个按钮上的 OnClickListener 既没有正确初始化也没有按预期工作【英文标题】:OnClickListener on second button is neither initialized properly nor working as expected 【发布时间】:2017-04-07 21:18:35 【问题描述】:

我有 2 个按钮和 2 个单独的活动,我想要这样的控制流:

Activityone buttonOneActivityTwo buttonTwoActivityThree

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="horizontal"
android:gravity="right">

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:layout_weight="1.0">

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal">

        <Button
            android:layout_
            android:layout_
            android:background="@drawable/rozmare"/>

        <TextView
            android:layout_
            android:text="کار های روزمره"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:layout_
            android:gravity="center"
            android:textSize="25sp"/>

    </LinearLayout>

    <EditText
        android:textSize="20.0sp"
        android:gravity="top|right"
        android:id="@+id/editText1"
        android:padding="5.0dip"
        android:scrollbars="vertical"
        android:fadingEdge="vertical"
        android:layout_
        android:layout_
        android:text=""
        android:capitalize="sentences"
        android:layout_gravity="top|right"
        android:textColor="#000000"
        android:background="#FFFFFF"/>

</LinearLayout>

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:layout_margin="1dp">

    <ScrollView
        android:layout_
        android:layout_>

        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical">

            <Button
                android:layout_
                android:layout_
                android:id="@+id/notelist"
                android:background="@drawable/personal"
                android:layout_margin="1dp"/>

            <Button
                android:layout_
                android:layout_
                android:background="@drawable/kasbokar"
                android:layout_margin="1dp"
                android:id="@+id/notelist1"/>

        </LinearLayout>

    </ScrollView>

</LinearLayout>

</LinearLayout>

MainActivity.java

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Menu;
import android.widget.TextView;
import android.widget.EditText;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class MainActivity extends Activity 

Button buttonOne;
Button buttonTwo;
EditText editText1;
String fileName;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    addListenerOnButton();
    getActionBar().hide();
    getWindow().setSoftInputMode(3);
    editText1 = (EditText) findViewById(R.id.editText1);
    fileName = getResources().getString(R.string.file_name);
    try 
        FileInputStream fis = openFileInput(fileName);
        byte[] readBytes = new byte[fis.available()];
        fis.read(readBytes);
        editText1.setText(new String(readBytes));
        fis.close();
     catch (Exception e) 
        return;
    


public void onPause() 
    super.onPause();
    try 
        FileOutputStream fos = openFileOutput(fileName, 0);
        fos.write(editText1.getText().toString().getBytes());
        fos.close();
     catch (Exception e) 
        return;
    


public void addListenerOnButton() 

    final Context context = this;

    buttonOne = (Button) findViewById(R.id.notelist);

    buttonOne.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View arg0) 

                Intent intent = new Intent(context, NoteList.class);
                startActivity(intent);


    buttonTwo = (Button) findViewById(R.id.notelist1);

    buttonTwo.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View arg0) 

            Intent intent = new Intent(context, NoteList1.class);
            startActivity(intent);

            

        );





);

public void EXIT(View view) 

    finish();

manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ir.whitegate.noteking"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="16" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>
    <activity
        android:name=".NoteList"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustUnspecified"/>

    <activity 
        android:name=".NoteEdit"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustUnspecified"/>

    <activity
        android:name=".NoteList1"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustUnspecified"/>

    <activity 
        android:name=".NoteEdit1"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustUnspecified"/>
</application>

但是两个按钮都在执行相同的操作,它们都指向activityTwo,另一个问题是,如果我不触摸ButtonOneButtonTwo 将不起作用。

【问题讨论】:

我认为现有答案没有任何问题。如果您遇到错误,edit您的问题 【参考方案1】:

您已经在第一个按钮的侦听器中添加了第二个按钮的侦听器,所以

如果我不触摸 ButtonOne,ButtonTwo 将不起作用。

第二个按钮的监听器只有在你按下第一个按钮时才会被初始化

但它们应该是分开的

public void addListenerOnButton() 
    final Context context = this;   
    buttonOne = (Button) findViewById(R.id.notelist);

    buttonOne.setOnClickListener(new OnClickListener() 
        @Override
        public void onClick(View arg0)    
           Intent intent = new Intent(context, NoteList.class);
           startActivity(intent);
            
        );

    buttonTwo = (Button) findViewById(R.id.notelist1);

    buttonTwo.setOnClickListener(new OnClickListener()     
        @Override
        public void onClick(View arg0)    
            Intent intent = new Intent(context, NoteList1.class);
            startActivity(intent);    
                
        );    

他们俩都去activityTwo

此行为与仅使用相同的布局结构有关,因此请使用 settext 函数或更改 XML 代码。

【讨论】:

我不能有两个 addlistener 它不可能它说 addlistener 已经添加到代码中 我怎样才能有两个添加监听器? 你能在代码中显示它吗?这对我有很大的帮助。 @MohammadRezaMajidPour 这个答案启动了正确的 2 个活动课程。如果您看到相同的布局,那么问题是那些活动的 setContentView 使用相同的布局 @MohammadRezaMajidPour 我很高兴能帮上忙,欢迎您的朋友【参考方案2】:

您在第一个监听器中添加了第二个监听器。

buttonOne.setOnClickListener(new OnClickListener()

@Override
public void onClick(View arg0) 

    Intent intent = new Intent(context, NoteList.class);
    startActivity(intent);


    buttonTwo = (Button) findViewById(R.id.notelist1);

    // >>>>>>>>>>>>>>>>>>>>>>> inside buttonOne
    buttonTwo.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View arg0) 

            Intent intent = new Intent(context, NoteList1.class);
            startActivity(intent);

        

    );
    // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


); //  >>>>>>>>>> button one ends here

另一种声明 onClickListener 的简单方法是将其声明为如下所示的对象字段

  private View.OnClickListener clickListener = new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            switch (v.getId())
                case R.id.notelist1: 
                    // go to notelist 1
                    break;
                

                case R.id.notelist: 
                    // go to notelist 
                    break;
                
            
        
    ;

并在如下按钮上设置监听器

buttonOne.setOnClickListener(clickListener);
buttonTwo.setOnClickListener(clickListener);

【讨论】:

【参考方案3】:

解决您的问题的方法是在您的 xml 中定义 onClick 函数

<Button
android:text="Don't have an account? Join!"
android:onClick="toRegister"
android:layout_
android:layout_
/>

然后在你的类中定义你的函数

    public void toRegister(View view)

    Intent newIntent = new Intent(this, SignUpActivity.class);
    newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    LoginActivity.this.startActivity(newIntent);

【讨论】:

在 Java 中执行此操作更加清晰,而且您不会因为未实现该方法而出错。所以,不确定这是简单的解决方案

以上是关于第二个按钮上的 OnClickListener 既没有正确初始化也没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试使用图像按钮进入第二个活动时应用程序崩溃

RecyclerView 中的 OnClickListener 上的按钮并不总是可见

Android onClickListener 不会为子视图触发

单击第二个活动上的按钮在视图上执行“单击”或“滚动到”时出错

如何更改从第一个活动单击的按钮上的第二个活动的文本? [科特林]

在android中的不同活动中设置按钮上的时间