【问题标题】:Android - AutoCompleteTextView onClick gives an errorAndroid - AutoCompleteTextView onClick 给出错误
【发布时间】:2014-04-25 17:26:35
【问题描述】:

解决方案 如果您想要 AutoCompleteTextView 的 onClickListener,请不要在 XML 中执行此操作,而是在您的 Java 文件中执行此操作。请看下面我的回答。

原始问题

很抱歉,如果我错过了一些简单的事情,但我在过去 2 个小时里一直在做这个,但我被卡住了。

在我的活动中,我有 4 个由 ArrayList 填充的 AutoCompleteTextView,其值来自数据库查询。一切正常,直到我在四个 AutoCompleteTextView 中的任何一个上添加 android:onClick 属性。我不知道发生了什么,清理项目并没有救我。

相关代码如下:

我用于 AutoCompleteTextViews 的全局变量:

private ArrayList<String> brands = new ArrayList<String>();
private ArrayList<String> items = new ArrayList<String>();
private ArrayList<String> parts = new ArrayList<String>();
private ArrayList<String> barcodes = new ArrayList<String>();

private AutoCompleteTextView brandACTV;
private AutoCompleteTextView itemACTV;
private AutoCompleteTextView partACTV;
private AutoCompleteTextView barcodeACTV;

private ArrayAdapter<String> adapter;

我的onCreate() 函数,非常标准,我设置了布局并初始化了我的 AutoCompleteTextViews

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_page);

    TextView customerName = (TextView) findViewById(R.id.customerName);
    customerName.setText(getIntent().getStringExtra("customer"));

    brandACTV = (AutoCompleteTextView) findViewById(R.id.actvBrand);
    itemACTV = (AutoCompleteTextView) findViewById(R.id.actvItemName);
    partACTV = (AutoCompleteTextView) findViewById(R.id.actvPart);
    barcodeACTV = (AutoCompleteTextView) findViewById(R.id.actvBarcode);


    new InitTask().execute("");
}

当我执行InitTask 线程时发生的情况是,我在执行数据库查询以为我的 AutoCompleteTextViews 初始化我的 ArrayList 数组时显示一个旋转的进度条。

在 InitTask 的 doInBackground 方法中,我调用了我的 getArrays() 函数:

public void getArrays(){
            //itemListDB is an object of my DatabaseAdapter class
    itemListDB.open();

    brands = itemListDB.getAllBrands();
    items = itemListDB.getAllItemNames();
    parts = itemListDB.getAllParts();
    barcodes = itemListDB.getAllBarcodes();

    itemListDB.close();

}

由于我无法在 doInBackground() 方法中更新 UI,因此我在我的线程的 onPostExecute() 方法中调用了我的 setAutoCompeteTextViews() 方法:

public void setAutoCompeteTextViews(){

    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, brands);
    brandACTV.setAdapter(adapter);
    brandACTV.setThreshold(1);

    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, items);
    itemACTV.setAdapter(adapter);
    itemACTV.setThreshold(1);

    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, parts);
    partACTV.setAdapter(adapter);
    partACTV.setThreshold(1);

    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, barcodes);
    barcodeACTV.setAdapter(adapter);
    barcodeACTV.setThreshold(1);

}

对于我的 XML,我将只展示我如何编写一个 AutoCompleteTextView,因为它们都很相似,只是 id 有所不同。

<AutoCompleteTextView 
    android:id="@+id/actvBrand"
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:layout_above="@+id/price"
    android:layout_alignLeft="@+id/submit"
    android:ems="10"
    android:hint="Brand"
    android:onClick="actvClicked" />

我在我的活动中定义我的actvClicked() 函数如下:

public void actvClicked(View view){
    switch (view.getId()) {
        case R.id.actvBrand:
            Log.d("Hi", "Brand pressed");
            break;

        case R.id.actvItemName:
            Log.d("Hi", "Item name pressed");
            break;

        case R.id.actvPart:
            Log.d("Hi", "Part pressed");
            break;

        case R.id.actvBarcode:
            Log.d("Hi", "Barcode pressed");
            break;
    }
}

但是,它不起作用,并且 logCat 给了我这个错误:

04-25 15:40:28.270: E/AndroidRuntime(24104): FATAL EXCEPTION: main
04-25 15:40:28.270: E/AndroidRuntime(24104): Process: com.agict.marswin, PID: 24104
04-25 15:40:28.270: E/AndroidRuntime(24104): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.agict.marswin/com.agict.marswin.SearchPage}: android.view.InflateException: Binary XML file line #73: Error inflating class android.widget.AutoCompleteTextView
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.app.ActivityThread.access$800(ActivityThread.java:135)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.os.Handler.dispatchMessage(Handler.java:102)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.os.Looper.loop(Looper.java:136)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.app.ActivityThread.main(ActivityThread.java:5017)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at java.lang.reflect.Method.invokeNative(Native Method)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at java.lang.reflect.Method.invoke(Method.java:515)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at dalvik.system.NativeStart.main(Native Method)
04-25 15:40:28.270: E/AndroidRuntime(24104): Caused by: android.view.InflateException: Binary XML file line #73: Error inflating class android.widget.AutoCompleteTextView
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.app.Activity.setContentView(Activity.java:1929)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at com.agict.marswin.SearchPage.onCreate(SearchPage.java:39)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.app.Activity.performCreate(Activity.java:5231)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
04-25 15:40:28.270: E/AndroidRuntime(24104):    ... 11 more
04-25 15:40:28.270: E/AndroidRuntime(24104): Caused by: java.lang.reflect.InvocationTargetException
04-25 15:40:28.270: E/AndroidRuntime(24104):    at java.lang.reflect.Constructor.constructNative(Native Method)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
04-25 15:40:28.270: E/AndroidRuntime(24104):    ... 24 more
04-25 15:40:28.270: E/AndroidRuntime(24104): Caused by: java.lang.NullPointerException
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.widget.AutoCompleteTextView$PassThroughClickListener.access$302(AutoCompleteTextView.java:1242)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.widget.AutoCompleteTextView.setOnClickListener(AutoCompleteTextView.java:200)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.view.View.<init>(View.java:3797)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.widget.TextView.<init>(TextView.java:623)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.widget.EditText.<init>(EditText.java:60)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.widget.AutoCompleteTextView.<init>(AutoCompleteTextView.java:137)
04-25 15:40:28.270: E/AndroidRuntime(24104):    at android.widget.AutoCompleteTextView.<init>(AutoCompleteTextView.java:133)
04-25 15:40:28.270: E/AndroidRuntime(24104):    ... 27 more

com.agict.marswin.SearchPage.onCreate(SearchPage.java:39) 在我的onCreate() 函数中指向我的setContentView() 调用。

很抱歉,我找不到任何错误,因为我正确声明了该函数,并且 XML 将查找的 Java 文件中没有任何缺失。

我很困惑,我不知道如何继续。我将不胜感激任何指导和帮助。谢谢。

【问题讨论】:

  • 来自不同项目的具有相同标识符的 2 个布局可能会导致此错误。
  • 如果您的数据来自 sqlite db,请使用 SimpleCursorAdapter 而不是 ArrayAdapter
  • @user3294034 我关闭了其他项目并清理了我的项目,但什么也没发生。
  • @pskink 我的getAll****() 方法返回ArrayList&lt;String&gt;。如果在我在 XML 中添加 onClick 之前我的代码运行良好,问题真的会出自于此吗?

标签: java android


【解决方案1】:

我没有在 XML 中声明 onClick,而是在 Java 文件中声明了它。在我的onCreate() 中,我这样做了:

    brandACTV = (AutoCompleteTextView) findViewById(R.id.actvBrand);
    itemACTV = (AutoCompleteTextView) findViewById(R.id.actvItemName);
    partACTV = (AutoCompleteTextView) findViewById(R.id.actvPart);
    barcodeACTV = (AutoCompleteTextView) findViewById(R.id.actvBarcode);

    brandACTV.setOnClickListener(actvClicked);
    itemACTV.setOnClickListener(actvClicked);
    partACTV.setOnClickListener(actvClicked);
    barcodeACTV.setOnClickListener(actvClicked);

我声明了一个名为 actvClicked 的 OnClickListener 函数,如下所示:

OnClickListener actvClicked = new OnClickListener(){
    @Override
    public void onClick(View view){
        switch (view.getId()) {
            case R.id.actvBrand:
                Log.d("Hi", "Brand pressed");
                break;

            case R.id.actvItemName:
                Log.d("Hi", "Item name pressed");
                break;

            case R.id.actvPart:
                Log.d("Hi", "Part pressed");
                break;

            case R.id.actvBarcode:
                Log.d("Hi", "Barcode pressed");
                break;
        }
    }
};

但是,我现在的问题是我必须在触发 onClickListener 之前按两次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2020-02-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多