Android中AutoCompleteSearch触发Activity onResume致输入消失问题求助
我之前也碰到过类似的坑,结合你的场景,大概率是以下几个原因导致的,咱们一步步来排查解决:
1. 阻止Activity因配置变化重启
当软键盘弹出时,系统可能判定屏幕配置发生了变化(比如布局高度调整),如果你的Activity没处理这种变化,就会触发重启,进而调用onResume(),导致Fragment视图被重新创建,输入框自然就消失了。
解决方法:
在AndroidManifest.xml中对应Activity的标签里添加配置变化声明:
<activity android:name=".YourMainActivity" android:configChanges="keyboardHidden|orientation|screenSize|smallestScreenSize|keyboard"> <!-- 其他属性保留 --> </activity>
然后在Activity中重写onConfigurationChanged方法,告诉系统你自己处理配置变化,避免重启:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 无需额外操作,只要调用父类方法即可 }
2. 避免在Activity的onResume()中重复初始化ViewPager/Fragment
很多开发者会不小心把ViewPager的Adapter初始化逻辑放在onResume()里,这样每次Activity回到前台都会重新创建Adapter,导致Fragment被重新实例化,之前的输入框状态直接丢失。
检查&修复:
确保ViewPager和FragmentPagerAdapter的初始化只在onCreate()中执行一次:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPager viewPager = findViewById(R.id.view_pager); // 只初始化一次Adapter viewPager.setAdapter(new YourFragmentPagerAdapter(getSupportFragmentManager())); // 其他初始化代码 }
如果必须在onResume()中做操作,绝对不要重新创建Adapter或Fragment实例。
3. 保存Fragment的输入框状态
当切换到其他Fragment时,当前Fragment的视图可能会被销毁(onDestroyView()),回到该Fragment时会重新调用onCreateView(),如果没保存输入状态,输入框就会清空消失。
解决方法:
用ViewModel保存输入内容,在视图重建时恢复:
public class MapFragment extends Fragment { private MapViewModel viewModel; private AutoCompleteTextView autoCompleteSearch; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); viewModel = new ViewModelProvider(this).get(MapViewModel.class); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_map, container, false); autoCompleteSearch = view.findViewById(R.id.auto_complete_search); // 恢复之前的输入内容 autoCompleteSearch.setText(viewModel.getSearchContent().getValue()); return view; } @Override public void onPause() { super.onPause(); // 保存当前输入内容到ViewModel viewModel.getSearchContent().setValue(autoCompleteSearch.getText().toString()); } } // 对应的ViewModel类 public class MapViewModel extends ViewModel { private MutableLiveData<String> searchContent = new MutableLiveData<>(); public MutableLiveData<String> getSearchContent() { return searchContent; } }
4. 检查Google Maps AutoComplete组件的初始化逻辑
如果你用的是Google官方的AutocompleteSupportFragment,确保只在Fragment的onViewCreated()中初始化一次,不要在Activity的生命周期方法里重复添加或初始化该组件:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment) getChildFragmentManager().findFragmentById(R.id.autocomplete_fragment); // 仅在第一次创建视图时初始化 if (autocompleteFragment != null) { autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME)); autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { @Override public void onPlaceSelected(@NonNull Place place) { // 处理选中的地点 } @Override public void onError(@NonNull Status status) { // 处理错误情况 } }); } }
按照上面的步骤排查,应该就能解决输入框消失的问题了。
内容的提问来源于stack exchange,提问作者Otniel-Bogdan Mercea

