第二个按钮上的 OnClickListener 既没有正确初始化也没有按预期工作
Posted
技术标签:
【中文标题】第二个按钮上的 OnClickListener 既没有正确初始化也没有按预期工作【英文标题】:OnClickListener on second button is neither initialized properly nor working as expected 【发布时间】:2017-04-07 21:18:35 【问题描述】:我有 2 个按钮和 2 个单独的活动,我想要这样的控制流:
Activityone
buttonOne
➡ActivityTwo
buttonTwo
➡ActivityThree
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
,另一个问题是,如果我不触摸ButtonOne
,ButtonTwo
将不起作用。
【问题讨论】:
我认为现有答案没有任何问题。如果您遇到错误,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 不会为子视图触发
单击第二个活动上的按钮在视图上执行“单击”或“滚动到”时出错