onClick 按钮 Android

Posted

技术标签:

【中文标题】onClick 按钮 Android【英文标题】:onClick button Android 【发布时间】:2016-09-09 08:04:46 【问题描述】:

我是 android 开发的初学者,所以我使用 Eclipse 基于克单位转换创建了一个 Android 应用程序,但它不起作用。

我的 Android 应用程序的概念是,我正在使用包含三个项目的导航抽屉:Home(Accueil)、Converter(Convertisseur) 和 About(A Propos)。 所以当我点击转换器选项时,它必须显示一个包含克单位转换的片段。当我输入要转换的值并选择我想要的转换单位时,当我单击转换按钮 (Convertir) 时,应用程序会自动堆叠并关闭。

谁能帮帮我,拜托!

这是我的片段类:

    package com.hw.converter;

import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

public class ConverterFragment extends Fragment 
    String[] units;
    Spinner spn1, spn2;
    EditText editValue;
    TextView tvResult;
    double value;
    Button myBtn;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        return inflater.inflate(R.layout.fragment_converter, container, false);

    

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) 
        super.onViewCreated(view, savedInstanceState);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getView().getContext(),
                R.array.units, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spn1 = (Spinner)getView().findViewById(R.id.spnUnits1);
        spn2 = (Spinner)getView().findViewById(R.id.spnUnits2);
        units = getResources().getStringArray(R.array.units);
        spn1.setAdapter(adapter);
        spn2.setAdapter(adapter);


    
    public void convertir(View view)
        String edit = editValue.getText().toString();
        if(edit == null || edit.isEmpty()) 
          value = 0.0;
         else 
          value = Double.parseDouble(edit);
        
        tvResult = (TextView)getView().findViewById(R.id.tvResult);
        int choix1 = spn1.getSelectedItemPosition();
        int choix2 = spn2.getSelectedItemPosition();
        switch(choix1)
        case 0:
            switch(choix2)
            case 0:
                tvResult.setText(value+" mg");break;
            case 1:
                value/=10;
                tvResult.setText(value+" cg");break;
            case 2:
                value/=100;
                tvResult.setText(value+" dg");break;
            case 3:
                value/=1000;
                tvResult.setText(value+" g");break;
            case 4:
                value/=10000;
                tvResult.setText(value+" dag");break;
            case 5:
                value/=100000;
                tvResult.setText(value+" hg");break;
            case 6:
                value/=1000000;
                tvResult.setText(value+" kg");break;
            default:
                tvResult.setText(value+" g");break;
            break;

        case 1:
            switch(choix2)
            case 0:
                value*=10;
                tvResult.setText(value+" mg");break;
            case 1:
                editValue.setText(value+" cg");break;
            case 2:
                value/=10;
                tvResult.setText(value+" dg");break;
            case 3:
                value/=100;
                tvResult.setText(value+" g");break;
            case 4:
                value/=1000;
                tvResult.setText(value+" dag");break;
            case 5:
                value/=10000;
                tvResult.setText(value+" hg");break;
            case 6:
                value/=100000;
                tvResult.setText(value+" kg");break;
            default:
                tvResult.setText(value+" g");break;
            break;
            

        case 2:
            switch(choix2)
            case 0:
                value*=100;
                tvResult.setText(value+" mg");break;
            case 1:
                value*=10;
                tvResult.setText(value+" cg");break;
            case 2:
                tvResult.setText(value+" dg");break;
            case 3:
                value/=10;
                tvResult.setText(value+" g");break;
            case 4:
                value/=100;
                tvResult.setText(value+" dag");break;
            case 5:
                value/=1000;
                tvResult.setText(value+" hg");break;
            case 6:
                value/=10000;
                tvResult.setText(value+" kg");break;
            default:
                tvResult.setText(value+" g");break;
            break;
        

        case 3:
            switch(choix2)
            case 0:
                value*=1000;
                tvResult.setText(value+" mg");break;
            case 1:
                value*=100;
                tvResult.setText(value+" cg");break;
            case 2:
                value*=10;
                tvResult.setText(value+" dg");break;
            case 3:
                tvResult.setText(value+" g");break;
            case 4:
                value/=10;
                tvResult.setText(value+" dag");break;
            case 5:
                value/=100;
                tvResult.setText(value+" hg");break;
            case 6:
                value/=1000;
                tvResult.setText(value+" kg");break;
            default:
                tvResult.setText(value+" g");break;
            break;
            
        case 4:
        switch(choix2)
        case 0:
            value*=10000;
            tvResult.setText(value+" mg");break;
        case 1:
            value*=1000;
            tvResult.setText(value+" cg");break;
        case 2:
            value*=100;
            tvResult.setText(value+" dg");break;
        case 3:
            value*=10;
            tvResult.setText(value+" g");break;
        case 4:
            tvResult.setText(value+" dag");break;
        case 5:
            value/=10;
            tvResult.setText(value+" hg");break;
        case 6:
            value/=100;
            editValue.setText(value+" kg");break;
        default:
            tvResult.setText(value+" g");break;
        break;
        
        case 5:
            switch(choix2)
            case 0:
                value*=100000;
                tvResult.setText(value+" mg");break;
            case 1:
                value*=10000;
                tvResult.setText(value+" cg");break;
            case 2:
                value*=1000;
                tvResult.setText(value+" dg");break;
            case 3:
                value*=100;
                tvResult.setText(value+" g");break;
            case 4:
                value*=10;
                tvResult.setText(value+" dag");break;
            case 5:
                tvResult.setText(value+" hg");break;
            case 6:
                value/=10;
                tvResult.setText(value+" kg");break;
            default:
                tvResult.setText(value+" g");break;
            break;
        
        case 6:
            switch(choix2)
            case 0:
                value*=1000000;
                tvResult.setText(value+" mg");break;
            case 1:
                value*=100000;
                tvResult.setText(value+" cg");break;
            case 2:
                value*=10000;
                tvResult.setText(value+" dg");break;
            case 3:
                value*=1000;
                tvResult.setText(value+" g");break;
            case 4:
                value*=100;
                tvResult.setText(value+" dag");break;
            case 5:
                value*=10;
                tvResult.setText(value+" hg");break;
            case 6:
                tvResult.setText(value+" kg");break;
            default:
                tvResult.setText(value+" g");break;
            break;

        

        
    



这是我的转换器布局代码:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawerLayout"
    android:layout_
    android:layout_
    tools:context="com.hw.converter.ConverterActivity" >

   <ListView android:id="@+id/drawerList"
        android:layout_
        android:layout_
        android:entries="@array/mymenu"
        android:layout_gravity="start">

   </ListView>

    <RelativeLayout android:id="@+id/convertContent"
        android:layout_
        android:layout_
        >

       <TextView
           android:id="@+id/tvTitle"
           android:layout_
           android:layout_
           android:layout_alignParentTop="true"
           android:layout_centerHorizontal="true"
           android:text="@string/tvTitle"
           android:textAppearance="?android:attr/textAppearanceLarge" />
        <TextView 
          android:id="@+id/tv1"
           android:layout_
           android:layout_
           android:layout_alignParentLeft="true"
           android:layout_alignParentStart="true"
           android:paddingTop="25dp"
           android:layout_below="@id/tvTitle"
           android:text="@string/tv1"
           android:textAppearance="?android:attr/textAppearanceLarge" />

         <Spinner
             android:id="@+id/spnUnits1"
             android:layout_
             android:layout_
             android:layout_alignTop="@+id/tv1"
             android:layout_marginLeft="41dp"
             android:layout_marginStart="41dp"
             android:layout_marginTop="30dp"
             android:layout_toEndOf="@+id/tv1"
             android:layout_toRightOf="@+id/tv1"

              />

        <EditText
            android:id="@+id/editQte"
            android:layout_
            android:layout_
            android:layout_below="@+id/tv1"
            android:inputType="number"
            android:hint="@string/editHint"
            >

        </EditText>
        <Spinner
            android:id="@+id/spnUnits2"
            android:layout_
            android:layout_
            android:layout_alignTop="@+id/tv2"
            android:layout_below="@+id/editQte"
           android:layout_marginLeft="41dp"
           android:layout_marginStart="41dp"
           android:layout_marginTop="30dp"
           android:layout_toEndOf="@+id/tv2"
           android:layout_toRightOf="@+id/tv2"
            />

         <TextView 
          android:id="@+id/tv2"
           android:layout_
           android:layout_
           android:layout_alignParentLeft="true"
           android:layout_alignParentStart="true"
           android:paddingTop="25dp"
           android:layout_marginTop="20dp"
           android:layout_below="@id/tv1"
           android:text="@string/tv2"
           android:textAppearance="?android:attr/textAppearanceLarge"
          />

         <Button
            android:id="@+id/btnConvert"
            android:layout_
            android:layout_
            android:layout_below="@+id/spnUnits2"
            android:layout_marginTop="56dp"
            android:layout_centerInParent="true"
            android:text="@string/btnConvert"
            android:onClick="com.hw.converter.ConverterFragment.convertir" />

         <TextView
            android:id="@+id/tvResult"
            android:layout_
            android:layout_
            android:layout_below="@+id/btnConvert"
            android:layout_marginTop="24dp"
            android:text="@string/tvResult"
            android:layout_marginLeft="20dp"
            android:layout_marginStart="20dp"
            android:textAppearance="?android:attr/textAppearanceLarge" />

    </RelativeLayout>



</android.support.v4.widget.DrawerLayout>

编辑:现在错误日志有意义,请您帮忙! 这是我更改后得到的错误日志:

05-13 10:30:29.972: E/AndroidRuntime(5621): FATAL EXCEPTION: main
05-13 10:30:29.972: E/AndroidRuntime(5621): Process: com.hw.converter, PID: 5621
05-13 10:30:29.972: E/AndroidRuntime(5621): java.lang.IllegalStateException: Could not find a method com.hw.converter.ConverterFragment.convertir(View) in the activity class com.hw.converter.MainActivity for onClick handler on view class android.widget.Button with id 'btnConvert'
05-13 10:30:29.972: E/AndroidRuntime(5621):     at android.view.View$1.onClick(View.java:3864)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at android.view.View.performClick(View.java:4492)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at android.view.View$PerformClick.run(View.java:18568)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at android.os.Handler.handleCallback(Handler.java:733)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at android.os.Handler.dispatchMessage(Handler.java:95)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at android.os.Looper.loop(Looper.java:136)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at android.app.ActivityThread.main(ActivityThread.java:5021)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at java.lang.reflect.Method.invokeNative(Native Method)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at java.lang.reflect.Method.invoke(Method.java:515)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at dalvik.system.NativeStart.main(Native Method)
05-13 10:30:29.972: E/AndroidRuntime(5621): Caused by: java.lang.NoSuchMethodException: com.hw.converter.ConverterFragment.convertir [class android.view.View]
05-13 10:30:29.972: E/AndroidRuntime(5621):     at java.lang.Class.getConstructorOrMethod(Class.java:472)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at java.lang.Class.getMethod(Class.java:857)
05-13 10:30:29.972: E/AndroidRuntime(5621):     at android.view.View$1.onClick(View.java:3857)
05-13 10:30:29.972: E/AndroidRuntime(5621):     ... 11 more

【问题讨论】:

你遇到了什么错误? 请分享错误日志 android:onClick 方法 - 必须是公共的并且 View 作为唯一参数.. 感谢您的回答,我更改了我的代码,但它得到了堆栈。错误日志显示:threadid=1: thread exiting with uncaught exception. 看看我的问题,我确实在 5 分钟前更改了它,如果你想查看它,我会发布错误日志。 【参考方案1】:

it4Asuces,

按钮的onClick动作的默认签名应该是

public void NameOfTheMethod(View view) 

所以改成

public void convertir(View view)

你还没有粘贴你的错误日志:) 虽然我相信它一定是说没有找到方法'convertir'。这是因为android会寻找以视图为参数的方法convertir :)

public void convertir(View view) 与 public void convertir() 不同。因此,请更新您的方法以符合 android 的要求,您应该一切顺利:)

编辑 根据您在评论中发布的错误日志,我认为崩溃的原因是

value = Double.parseDouble(editValue.getText().toString());

虽然我不能确定你发布的错误日志对我来说没有多大意义:(你可以如下更改你的代码,让我知道它是否能解决你的问题

String editValue = editValue.getText().toString();
if(editValue == null || editValue.isEmpty()) 
  value = 0.0;
 else 
  value = Double.parseDouble(editValue);

Null 或空值在 JAVA Double.parseDouble 中不被视为可解析

问题应该解决了 :) 编码愉快

【讨论】:

感谢您的回答,我更改了我的代码,但它得到了堆栈。错误日志显示:threadid=1: thread exiting with uncaught exception (group=0x9ccdeb20) @it4astuces :你到底得到了什么错误???你能发布错误日志吗??? @it4astuces :您可以在 Eclipse 中获取错误日志,转到 Window-> Show View -> Other -> Android-> Logcat。请检查屏幕,您一定看到很多红色线条请在此处发布 :) 无论如何,这是一个免费建议:P 尽快转移到 Android Studio :) @it4astuces : 你更新了你的代码错误的伙伴 :) 你添加了 View view 争论到 onViewCreated 但你应该把它添加到 public void convertir() 正确???请将 converter() 方法更改为 public void convertir(View view) ... 这是我在第一个答案中回答的内容:) @it4astuces :再次检查,伙计 :) 您发布的有问题的代码没有它,即使您的错误日志说相同 :) 请参阅 :) 原因:java.lang.NoSuchMethodException:com.hw。 converter.ConverterFragment.convertir 您能否发布您的方法 convertir() 的代码以及您所做的修改:)【参考方案2】:

xml 文件

       <Button
        android:id="@+id/btnConvert"
        android:layout_
        android:layout_
        android:layout_below="@+id/spnUnits2"
        android:layout_marginTop="56dp"
        android:layout_centerInParent="true"
        android:text="@string/btnConvert"
        android:onClick="onClick" />

您的主文件

public class ConverterFragment extends Fragment 
String[] units;
Spinner spn1, spn2;
EditText editValue;
TextView tvResult;
double value;
Button myBtn;

.....
.....


public void onClick(View view) 


//action you want on button clicked   



【讨论】:

以上是关于onClick 按钮 Android的主要内容,如果未能解决你的问题,请参考以下文章

Android onclick监听器自定义listview

XML 中的 Android onClick 与 OnClickListener

js语句怎么直接写在 属性onclick中,不使用绑定函数名的方式

Cordova/Android on click/tap/vclick/touchstart 不工作

js 动态添加的按钮 onclick事件怎么写?

js动态给按钮增加onclick的函数事件(带参数)