片段中的自动完成文本
AutoCompleteText in Fragments
我正在尝试在 Fragments 中创建自动完成文本,我看过很多示例,但对我不起作用...我总是遇到与 adapter
相同的错误.事情在我的代码上没有出现任何错误,但是当我启动我的应用程序并单击它崩溃的片段时。
我的 LlistaGenericaFragment.java 看起来像:
public class LlistaGenericaFragment extends Fragment {
String[] totselements;
String[] imatgeselements;
public LlistaGenericaFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.llista_generica_fragment, container, false);
return rootView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
totselements = getResources().getStringArray(R.array.tots);
imatgeselements = getResources().getStringArray(R.array.imagenestots);
// Each row in the list stores country name, currency and flag
List<HashMap<String,String>> aList = new ArrayList<HashMap<String,String>>();
for(int i=0;i<24;i++){
HashMap<String, String> hm = new HashMap<String,String>();
hm.put("txt", totselements[i]);
hm.put("flag", (imatgeselements[i]) );
aList.add(hm);
}
// Keys used in Hashmap
String[] from = { "imatge","text"};
// Ids of views in listview_layout
int[] to = { R.id.imatgeelement,R.id.textelement};
// Instantiating an adapter to store each items
// R.layout.listview_layout defines the layout of each item
SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), aList, R.layout.llista_generica_fragment, from, to);
// Getting a reference to CustomAutoCompleteTextView of activity_main.xml layout file
CustomAutoCompleteTextView autoComplete = ( CustomAutoCompleteTextView) getActivity().findViewById(R.id.autocomplete);
/** Defining an itemclick event listener for the autocompletetextview */
AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
/** Each item in the adapter is a HashMap object.
* So this statement creates the currently clicked hashmap object
* */
HashMap<String, String> hm = (HashMap<String, String>) arg0.getAdapter().getItem(position); // UNCHECKED CAST ??????
}
};
/** Setting the adapter to the listView */
autoComplete.setAdapter(adapter);
}
我还为 AutoCompleteTextView 创建了一个 class,它看起来像:
public class CustomAutoCompleteTextView extends AutoCompleteTextView {
public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/** Returns the country name corresponding to the selected item */
@Override
protected CharSequence convertSelectionToString(Object selectedItem) {
/** Each item in the autocompetetextview suggestion list is a hashmap object */
HashMap<String, String> hm = (HashMap<String, String>) selectedItem; // <-- UNCHEKED CAST ????????
return hm.get("txt");
}
我在 LogCat 上遇到的错误是:
02-01 17:12:13.229 5317-5317/joancolmenero.taulaperiodica.com.taulaperiodicaapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: joancolmenero.taulaperiodica.com.taulaperiodicaapp, PID: 5317
java.lang.NullPointerException
at joancolmenero.taulaperiodica.com.taulaperiodicaapp.LlistaGenericaFragment.onCreate(LlistaGenericaFragment.java:100)
at android.app.Fragment.performCreate(Fragment.java:1678)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:859)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:684)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.FragmentManagerImpl.run(FragmentManager.java:443)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
at joancolmenero.taulaperiodica.com.taulaperiodicaapp.LlistaGenericaFragment.onCreate(LlistaGenericaFragment.java:100)
指向 autoComplete.setAdapter(adapter);
。
当我将 getActivity() 更改为 getView() 时,它没有崩溃,但显示:
02-01 17:51:49.118 10048-11634/joancolmenero.taulaperiodica.com.taulaperiodicaapp W/Filter﹕ An exception occured during performFiltering()!
java.lang.NullPointerException
at android.widget.SimpleAdapter$SimpleFilter.performFiltering(SimpleAdapter.java:354)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.os.HandlerThread.run(HandlerThread.java:61)
希望你能帮助我。
如果 AutoCompleteTextView
是您在 onCreateView
中 return 编辑的布局的一部分,在 Fragment 子类的 onCreate 中调用 getActivity().findViewById
,将 return 一个空对象,因为该片段尚未附加到 Activity 的视图层次结构。在您的情况下,最简单的解决方法是将您的逻辑移动到 onActivityCreated
中,它在 onCreateView
之后调用,并使用 getView().findViewById
查找属于您 [=20] 布局的视图=]编辑于 onCreateView
我正在尝试在 Fragments 中创建自动完成文本,我看过很多示例,但对我不起作用...我总是遇到与 adapter
相同的错误.事情在我的代码上没有出现任何错误,但是当我启动我的应用程序并单击它崩溃的片段时。
我的 LlistaGenericaFragment.java 看起来像:
public class LlistaGenericaFragment extends Fragment {
String[] totselements;
String[] imatgeselements;
public LlistaGenericaFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.llista_generica_fragment, container, false);
return rootView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
totselements = getResources().getStringArray(R.array.tots);
imatgeselements = getResources().getStringArray(R.array.imagenestots);
// Each row in the list stores country name, currency and flag
List<HashMap<String,String>> aList = new ArrayList<HashMap<String,String>>();
for(int i=0;i<24;i++){
HashMap<String, String> hm = new HashMap<String,String>();
hm.put("txt", totselements[i]);
hm.put("flag", (imatgeselements[i]) );
aList.add(hm);
}
// Keys used in Hashmap
String[] from = { "imatge","text"};
// Ids of views in listview_layout
int[] to = { R.id.imatgeelement,R.id.textelement};
// Instantiating an adapter to store each items
// R.layout.listview_layout defines the layout of each item
SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), aList, R.layout.llista_generica_fragment, from, to);
// Getting a reference to CustomAutoCompleteTextView of activity_main.xml layout file
CustomAutoCompleteTextView autoComplete = ( CustomAutoCompleteTextView) getActivity().findViewById(R.id.autocomplete);
/** Defining an itemclick event listener for the autocompletetextview */
AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
/** Each item in the adapter is a HashMap object.
* So this statement creates the currently clicked hashmap object
* */
HashMap<String, String> hm = (HashMap<String, String>) arg0.getAdapter().getItem(position); // UNCHECKED CAST ??????
}
};
/** Setting the adapter to the listView */
autoComplete.setAdapter(adapter);
}
我还为 AutoCompleteTextView 创建了一个 class,它看起来像:
public class CustomAutoCompleteTextView extends AutoCompleteTextView {
public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/** Returns the country name corresponding to the selected item */
@Override
protected CharSequence convertSelectionToString(Object selectedItem) {
/** Each item in the autocompetetextview suggestion list is a hashmap object */
HashMap<String, String> hm = (HashMap<String, String>) selectedItem; // <-- UNCHEKED CAST ????????
return hm.get("txt");
}
我在 LogCat 上遇到的错误是:
02-01 17:12:13.229 5317-5317/joancolmenero.taulaperiodica.com.taulaperiodicaapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: joancolmenero.taulaperiodica.com.taulaperiodicaapp, PID: 5317
java.lang.NullPointerException
at joancolmenero.taulaperiodica.com.taulaperiodicaapp.LlistaGenericaFragment.onCreate(LlistaGenericaFragment.java:100)
at android.app.Fragment.performCreate(Fragment.java:1678)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:859)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:684)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.FragmentManagerImpl.run(FragmentManager.java:443)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
at joancolmenero.taulaperiodica.com.taulaperiodicaapp.LlistaGenericaFragment.onCreate(LlistaGenericaFragment.java:100)
指向 autoComplete.setAdapter(adapter);
。
当我将 getActivity() 更改为 getView() 时,它没有崩溃,但显示:
02-01 17:51:49.118 10048-11634/joancolmenero.taulaperiodica.com.taulaperiodicaapp W/Filter﹕ An exception occured during performFiltering()!
java.lang.NullPointerException
at android.widget.SimpleAdapter$SimpleFilter.performFiltering(SimpleAdapter.java:354)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.os.HandlerThread.run(HandlerThread.java:61)
希望你能帮助我。
如果 AutoCompleteTextView
是您在 onCreateView
中 return 编辑的布局的一部分,在 Fragment 子类的 onCreate 中调用 getActivity().findViewById
,将 return 一个空对象,因为该片段尚未附加到 Activity 的视图层次结构。在您的情况下,最简单的解决方法是将您的逻辑移动到 onActivityCreated
中,它在 onCreateView
之后调用,并使用 getView().findViewById
查找属于您 [=20] 布局的视图=]编辑于 onCreateView