我在 Activity 中的 EditText 行的 Fragment 中遇到 ViewBinding 问题。该片段会启动一个对话框,询问用户是否要清除 EditText 行。 EditText 行在 Activity 的 xml 文件 (activity_edit.xml) 中设置为“CEditText”。 CEditText 在 Fragment 中用于当用户通过 Fragment 的对话框按钮按下确认时清除 EditText 行。
当我尝试替换以前的工作代码“...findViewById(R.id.CEditText)”以添加 CEditText 的绑定引用时,Android Studio 不会“看到”CEditText 变量。我确实尝试在片段的 onCreateView() 和 onViewCreated() 中 inflate() ActivityEditBinding ,并尝试在每个方法中绑定()它,但没有成功。
我在这里缺少什么?
public class SkycardClearFragment extends DialogFragment {
private SkyfragClearBinding binding15;
private ActivityEditBinding binding16; //AS says "field is never assigned"
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding15 = SkyfragClearBinding.inflate(inflater,container,false);
return binding15.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceSate) {
Button btnClearOK = binding15.btnClearOK;
btnClearOK.setOnClickListener(v -> {
if (getActivity() != null) {
// Create a reference to all of the EditTexts from the activity using the xml layout Ids.
**strong text**EditText ToDo = getActivity().getWindow().getDecorView().getRootView().binding16.CEditText; // AS error: "cannot resolve 'binding16'.
// This doesn't work either, the CEditText line does not clear.
EditText ToDo = binding16.CEditText;
// working code before ViewBinding
**strong text**EditText ToDo = getActivity().getWindow().getDecorView().getRootView().findViewById(R.id.CEditText);
ToDo.setText(null);
// Move the focus back the CEditText line on the fully cleared skycard,
// ready again for input.
getActivity().findViewById(R.id.CEditText).requestFocus();
}
}
}
}
您可以在活动中公开编辑文本:
public EditText getEditText() {
return binding.CEditText;
}
然后在对话框片段中这样访问:
btnClearOK.setOnClickListener(v -> {
if (getActivity() != null) {
//Cast getActivity to the actual host activity.
//Assuming activity name is MainActivity
EditText editText = ((MainActivity) getActivity()).getEditText();
//rest of your codes
}
}