Android如何在Fragment中使用ViewBinding引用Activity中的EditText

问题描述 投票:0回答:1

我在 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();
            }
        }        
    }
}
android android-fragments android-viewbinding
1个回答
0
投票

您可以在活动中公开编辑文本:

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

     }
  }

© www.soinside.com 2019 - 2024. All rights reserved.