解决方案 如果您想要为您的 AutoCompleteTextView 使用 onClickListener,请不要在 XML 中执行,而应在您的 Java 文件中执行。请参阅下面的答案。
原始问题
很抱歉,如果我错过了一些简单的事情,但过去 2 小时我一直在努力解决这个问题,但我被卡住了。
在我的 Activity 中,我有 4 个 AutoCompleteTextView,它们由一个 ArrayList 填充,其值来自数据库查询。一切正常,直到我添加 android:onClick
四个 AutoCompleteTextView 中任何一个的属性。我不知道发生了什么,清理项目并没有救我。
相关代码如下:
我用于 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
时发生了什么线程是我在执行数据库查询以初始化我的 AutoCompleteTextView 的 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方法,我称之为 setAutoCompeteTextViews()
onPostExecute()
中的方法我线程的方法:
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()
在我的 Activity 中的功能如下:
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)
指向我的 setContentView()
调用我onCreate()
功能。
很抱歉,我找不到任何错误,因为我正确地声明了该函数,而且我的 Java 文件中没有遗漏任何 XML 会查找的内容。
我很困惑,我不知道如何进行。我将不胜感激任何指导和帮助。谢谢。
最佳答案
我没有在 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 之前,我必须按其中任何一个按钮两次。
关于java - Android - AutoCompleteTextView onClick 给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23287129/