【问题标题】:"complete action using" dialog popping up when it shouldn't不应该弹出“使用完成操作”对话框
【发布时间】:2012-11-07 23:11:10
【问题描述】:

我有一个有 2 个按钮的应用程序:一个进行计算,另一个使用浏览器启动网站。当用户单击 button1 时,应显示答案。当用户点击 button2 时,浏览器会将他们定向到一个网站。问题是:单击 button1 会弹出一个“使用完成操作”对话框,提示用户选择 4 个事物(应用程序、进程等)之一。这以前没有发生过,而且很奇怪。我唯一能想到的可能是 onclicklistener 的问题,并且 button1 没有新的意图,所以我不知道这个对话框是如何出现的。

这是清单:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.example.costaload"
 android:versionCode="1"
 android:versionName="1.0" >

 <uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="15" />

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

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

 </application>

 </manifest>

这是我的代码:

package com.example.costaload;

import com.example.costloads.R;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Button;
import android.widget.TextView;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity {
EditText mile, diesel;
Button button1, button2;
TextView tv, tv2, tv3;
private double x, y, z, costper, gallon, litres, ophours, stopdrive;
CheckBox checkBox1, checkBox2, checkBox3, checkBox4;
NumberFormat format = NumberFormat.getCurrencyInstance();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mile = (EditText) findViewById(R.id.mile);
checkBox1 = (CheckBox) findViewById(R.id.checkBox1);
checkBox2 = (CheckBox) findViewById(R.id.checkBox2);
checkBox3 = (CheckBox) findViewById(R.id.checkBox3);
checkBox4 = (CheckBox) findViewById(R.id.checkBox4);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(button1onClickListener);
OnClickListener button2onClickListener = null;
button2.setOnClickListener(button2onClickListener);
tv = (TextView) findViewById(R.id.cost);
tv2 = (TextView) findViewById(R.id.cpm);
tv3 = (TextView) findViewById(R.id.gallons);
diesel = (EditText) findViewById(R.id.diesel);
}

private OnClickListener button1onClickListener = new OnClickListener() {
   public void onClick(final View v) {

    x = Double.parseDouble(mile.getText().toString());
    y = Double.parseDouble(diesel.getText().toString());
    if (checkBox2.isChecked()) {
        x = x * 2;
    }
    if (checkBox1.isChecked()) {
        x = x * 0.62137;
    }
    ophours = 0;
    ophours = (x / 55) + 2;
    if (ophours >= 11) {
        stopdrive = (ophours / 10) - 1;
        if (stopdrive > 1) { // This block isn't closed.
            ophours = ophours + (stopdrive * 10);
        }
        gallon = x / 5.5;
        if (checkBox4.isChecked()) {
            gallon = gallon + (ophours * 1.1);
        }
        if (checkBox3.isChecked()) {
            litres = gallon * 3.785;
            tv3.setText(new DecimalFormat("####.##").format(litres)
                    + "L");
        }
        z = (gallon * y) + (x * 0.655);
        costper = z / x;
        tv.setText(format.format(z));
        tv2.setText(format.format(costper) + "/mile");
        tv3.setText(new DecimalFormat("####.##").format(gallon)
                + "gal.");
    }
    ;
};

private OnClickListener button2OnClickListener = new OnClickListener() {
    public void onClick(final View v) {

        Intent browserIntent = new Intent(Intent.ACTION_VIEW,
                Url.parse("http://www.ratenroll.com"));
        startActivity(browserIntent);
    }
  };
 };
};

这里是活动 xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:text="# of miles"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/textView1"
    android:layout_marginTop="40dp"
    android:text="Price of diesel"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<EditText
    android:id="@+id/diesel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/textView2"
    android:layout_alignBottom="@+id/textView2"
    android:layout_alignLeft="@+id/mile"
    android:layout_alignParentRight="true"
    android:ems="10"
    android:inputType="numberDecimal" />

<EditText
    android:id="@+id/mile"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/checkBox3"
    android:ems="10"
    android:inputType="numberDecimal" >

    <requestFocus />
</EditText>

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:text="Visit www.ratenroll.com" />

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/diesel"
    android:layout_marginTop="14dp"
    android:text="Kilometres (not miles)" />

<CheckBox
    android:id="@+id/checkBox2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/checkBox1"
    android:layout_alignBottom="@+id/checkBox1"
    android:layout_alignParentRight="true"
    android:text="Round trip" />

<CheckBox
    android:id="@+id/checkBox3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/checkBox1"
    android:text="Litres (not gallons)" />

<CheckBox
    android:id="@+id/checkBox4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/checkBox3"
    android:layout_alignBottom="@+id/checkBox3"
    android:layout_alignParentRight="true"
    android:text="Reefer load" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/checkBox3"
    android:layout_marginTop="50dp"
    android:layout_toRightOf="@+id/textView2"
    android:text="Compute" />

<TextView
    android:id="@+id/textView3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/button1"
    android:layout_marginTop="26dp"
    android:text="Total Cost"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/textView4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/textView3"
    android:text="Cost per mile"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/cost"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/textView4"
    android:layout_alignParentRight="true"
    android:text=" "
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/cpm"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/textView4"
    android:layout_alignBottom="@+id/textView4"
    android:layout_alignParentRight="true"
    android:text="   "
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/textView5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignRight="@+id/textView4"
    android:layout_below="@+id/textView4"
    android:text="Fuel required"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/gallons"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/textView5"
    android:layout_alignBottom="@+id/textView5"
    android:layout_alignParentRight="true"
    android:text="   "
    android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

感谢您的关注。

【问题讨论】:

    标签: java android


    【解决方案1】:

    您在两个按钮上添加相同的onClickListener并使用switch语句区分它们的方法容易出错。

    package com.example.costaload;
    
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
    
    import android.net.Uri;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.Button;
    import android.widget.TextView;
    import android.view.View;
    import android.view.View.OnClickListener;
    
    public class MainActivity extends Activity {
        EditText mile, diesel;
        Button button1, button2;
        TextView tv, tv2, tv3;
        private double x, y, z, costper, gallon, litres, ophours, stopdrive;
        CheckBox checkBox1, checkBox2, checkBox3, checkBox4;
        NumberFormat format = NumberFormat.getCurrencyInstance();
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mile = (EditText) findViewById(R.id.mile);
            checkBox1 = (CheckBox) findViewById(R.id.checkBox1);
            checkBox2 = (CheckBox) findViewById(R.id.checkBox2);
            checkBox3 = (CheckBox) findViewById(R.id.checkBox3);
            checkBox4 = (CheckBox) findViewById(R.id.checkBox4);
            button1 = (Button) findViewById(R.id.button1);
            button2 = (Button) findViewById(R.id.button2);
            button1.setOnClickListener(button1onClickListener);
            button2.setOnClickListener(button2OnClickListener);
            tv = (TextView) findViewById(R.id.cost);
            tv2 = (TextView) findViewById(R.id.cpm);
            tv3 = (TextView) findViewById(R.id.gallons);
            diesel = (EditText) findViewById(R.id.diesel);
        }
    
        private OnClickListener button1onClickListener = new OnClickListener() {
            public void onClick(final View v) {
    
                x = Double.parseDouble(mile.getText().toString());
                y = Double.parseDouble(diesel.getText().toString());
                if (checkBox2.isChecked()) {
                    x = x * 2;
                }
    
                if (checkBox1.isChecked()) {
                    x = x * 0.62137;
                }
    
                ophours = 0;
                ophours = (x / 55) + 2;
    
                if (ophours >= 11) {
                    stopdrive = (ophours / 10) - 1;
                }
                if (stopdrive > 1) {
                    ophours = ophours + (stopdrive * 10);
                }
    
                gallon = x / 5.5;
    
                if (checkBox4.isChecked()) {
                    gallon = gallon + (ophours * 1.1);
                }
    
                if (checkBox3.isChecked()) {
                    litres = gallon * 3.785;
                    tv3.setText(new DecimalFormat("####.##").format(litres) + "L");
                }
    
                z = (gallon * y) + (x * 0.655);
                costper = z / x;
                tv.setText(format.format(z));
                tv2.setText(format.format(costper) + "/mile");
                tv3.setText(new DecimalFormat("####.##").format(gallon) + "gal.");
            }
    
        };
    
        private OnClickListener button2OnClickListener = new OnClickListener() {
            public void onClick(final View v) {
    
                Intent browserIntent = new Intent(Intent.ACTION_VIEW,
                        Uri.parse("http://www.ratenroll.com"));
                startActivity(browserIntent);
            }
        };
    };
    

    我没有更改您的 xml 文件。

    祝你好运。

    【讨论】:

    • 好点,它也消除了在(缺少的)默认值中没有断言条件的不安:开关的声明。
    • 您好,我最初尝试使用两个侦听器,看到一个使用“case”的示例,看起来更整洁。 Eclipse 不断抛出错误,就像它完全在搞砸我哈哈。特别是,当我放入我的第二个按钮监听器 button2.setOnClickListener(button2onClickListener);我知道它无法解析为变量,所以 Eclipse 让我放入一个局部变量,然后将其设置为 null。然后我还得到“字段 new View.OnClickListener(){}.button2OnClickListener 的值从未使用过”。为什么第二个听众让我这么难受?
    • @Jason:嗨,我更新了我的代码并查看了 XML 事件,但在尝试实现第二次点击监听器时遇到了同样的困难。开始出现奇怪的错误,比如 Eclipse 突然不知道“R”是什么。呃。
    • 在处理上述代码时,您可能会遇到一个错误,上面写着“预期的}”或类似的东西。该错误显示在页面底部的下方,因此您在此处添加了 }。问题是那不是它真正属于的地方。如果您将发布完整的 xml 布局和活动类,我将帮助您解决这个问题。准备好花几天时间寻找一个错过的分号,直到你能流利地使用这种语言。
    • @Jason:是的,事情就是这样。我已经发布了我的 xml 和现在的代码。
    【解决方案2】:

    那个额外的大括号在这里做什么?

    tv3.setText(new DecimalFormat("####.##").format(gallon)+"gal.");
             break;}  // did you mean to do this?
    

    在第二个 case 语句中将大括号移到 break; 之后。

    附:请养成正确缩进代码和对齐大括号的习惯。还可以使用 IDE 的自动代码格式化功能来保持整洁。它会让你的事情变得更容易。

    附言对于其他读者。为什么这甚至编译为第二个 case 语句现在在 switch 之外?

    【讨论】:

    • 他在第一种情况下有一个未关闭的 if 语句,该语句在第一次中断后关闭。下一个大括号关闭了开关。
    • 啊,是的,错过了。谢谢!
    • @Simon,我想知道为什么它也编译了,因为 Eclipse 提出了所有这些建议,我理所当然地认为 Eclipse 停止抱怨是正确的。 :)
    猜你喜欢
    • 2023-03-10
    • 2011-05-23
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多