【问题标题】:Intent is not calling when button is pressed按下按钮时没有调用意图
【发布时间】:2017-12-28 06:32:04
【问题描述】:

我有以下代码。我正在从主要活动中调用第二个活动。每当按下发送按钮时,我想要一个 toast 以显示按钮被按下并启动活动。但由于一些上下文问题,只有 toast 是出现。请更正上下文的意图,并就这些上下文给出一些清晰的解释。

MainActivity.java

public class MainActivity extends AppCompatActivity {

public final static String EXTRA_MESSAGE="com.example.iamka.androiddevelop.MESSAGE";
public void Toast1(String s){
    Toast.makeText(this,s+" is called",Toast.LENGTH_SHORT).show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("My app","onCreate is called");
    Toast1("onCreate");
    Button btn=(Button)findViewById(R.id.button);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("My app","Button is pressed");
            Toast.makeText(MainActivity.this,"Button pressed",Toast.LENGTH_SHORT).show();
        }
    });
}
public void sendMessage(View view) {
    // Do something in response to button
    Intent intent = new Intent(MainActivity.this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.editText);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    Log.i("intent","intent is started");
    startActivity(intent);
}
}

DisplayMessageActivity.java

public class DisplayMessageActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_message);
    // Get the Intent that started this activity and extract the string
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Capture the layout's TextView and set the string as its text
    TextView textView =(TextView) findViewById(R.id.textView);
    Log.i("intent","displaymessage");
    textView.setText(message);
}
}

activity_main.xml

<EditText
    android:id="@+id/editText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:ems="10"
    android:hint="@string/edit_message"
    android:inputType="textPersonName"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/button"
    app:layout_constraintHorizontal_chainStyle="spread" />

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="16dp"
    android:onClick="sendMessage"
    android:text="@string/button_send"
    app:layout_constraintBaseline_toBaselineOf="@+id/editText"
    app:layout_constraintLeft_toRightOf="@+id/editText"
    app:layout_constraintRight_toRightOf="parent" />

activity_display_message.xml

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:text="TextView"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

当我删除 onClickListener() 方法时,意图就起作用了。

【问题讨论】:

  • 你没有在代码中的任何地方调用sendMessage()。
  • 我相信你不能使用android:onClick 和View.OnClickListener。最后一个将删除第一个。这就解释了为什么。只需在 View.OnClickListener 中调用方法 sendMessage
  • 只需删除按钮的android:onClick="sendMessage" 并尝试。您必须在 xml 或类文件中设置单击侦听器。两者都行不通
  • @NaveenKumarM 我正在​​调用 activity_main.xml 中的 sendMessage()。查看 xml 文件中的按钮标签
  • 是的,删除它并从类文件中在 Toast 之后调用它

标签: java android-intent android-context


【解决方案1】:

由于您正在设置自己的View.OnClickListener,因此您正在从 XML 定义中删除它。 Button 只支持一个View.OnClickListener。首先,XML 将从android:onclick 属性创建一个,例如:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        sendMessage(v);
    }
});

然后您将使用Toast 设置您的。该按钮只会保留最后一个,因此永远不会发送Intent。

解决方案:

  • 在你的监听器中调用sendMessage方法

喜欢:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("My app","Button is pressed");
        Toast.makeText(MainActivity.this,"Button pressed",Toast.LENGTH_SHORT).show();
        sendMessage(v); //Or anywhere in that method, your call.
    }
});
  • 删除监听器以保留android:onclick创建的监听器。

仅供参考:

通常,set### 方法意味着这不支持多个值,add### 方法支持。

此外,如果您愿意,您可以查看 android- multi onClick listener in one button 以实现您自己的多监听器按钮。但是我没有检查是否有更多最新的...

【讨论】:

    【解决方案2】:

    只需删除按钮的android:onClick="sendMessage" 并尝试。您必须在 xml 或类文件中设置单击侦听器。两者都行不通

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="16dp"
        android:text="@string/button_send"
        app:layout_constraintBaseline_toBaselineOf="@+id/editText"
        app:layout_constraintLeft_toRightOf="@+id/editText"
        app:layout_constraintRight_toRightOf="parent" />
    

    在你的活动中改变这个:

    btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("My app","Button is pressed");
                Toast.makeText(MainActivity.this,"Button pressed",Toast.LENGTH_SHORT).show();
                sendMessage();
            }
        });
    
    private void sendMessage() {
        // Do something in response to button
        Intent intent = new Intent(MainActivity.this, DisplayMessageActivity.class);
        EditText editText = (EditText) findViewById(R.id.editText);
        String message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message);
        Log.i("intent","intent is started");
        startActivity(intent);
    }
    

    【讨论】:

    • 如果我删除 android:onClick="sendMessage" 则不会创建第二个活动
    • 我编辑了我的答案,请试试这个
    • @ThakurKarthk 你能接受我的回答吗?我认为它对你有用。谢谢
    • 您的回答也对我有用,谢谢!但上面的答案有一些解释。祝你有美好的一天。
    • @ThakurKarthik 谢谢
    【解决方案3】:

    只需复制粘贴以下 MainActivity 代码即可完成工作。首先加载 xml,然后在运行时再次将 onclick 侦听器设置为按钮。因此 xmls onclick 已被您在 java 代码中的 onclick 侦听器替换。因此你得到了祝酒词,但 sendMessage() 永远不会被调用

       public class MainActivity extends AppCompatActivity {
    
       public final static String EXTRA_MESSAGE="com.example.iamka.androiddevelop.MESSAGE";
    public void Toast1(String s){
    Toast.makeText(this,s+" is called",Toast.LENGTH_SHORT).show();
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("My app","onCreate is called");
    Toast1("onCreate");
    Button btn=(Button)findViewById(R.id.button);
    
    }
    public void sendMessage(View view) {
    // Do something in response to button
    Intent intent = new Intent(MainActivity.this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.editText);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    Log.i("intent","intent is started");
    startActivity(intent);
    }
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      相关资源
      最近更新 更多