在片段中,如何查找活动布局中定义的视图?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在片段中,如何查找活动布局中定义的视图?相关的知识,希望对你有一定的参考价值。
在我的活动的布局中,我有一个我想要从其附加片段访问的视图。
我怎么能这样做?
通常,从片段中,找到片段布局中定义的视图(因此它是另一个用例),我只是使用inflater
来膨胀片段的布局,并调用findVieById
。
但由于我的视图是在活动的布局中定义的,所以我无法做到这一点。
我可以使用getActivity().findViewById
吗?
在我的活动的布局中,我有一个我想要从其附加片段访问的视图。
不,你不想。
我怎么能这样做?
getActivity().findViewById(R.id.blah)
,但你不应该。
但由于我的视图是在活动的布局中定义的,所以我无法做到这一点。
从技术上讲,你可以,你不应该。
我可以使用getActivity()。findViewById吗?
是的,但你不应该。
至于正确的答案,这就是他们创建android Architecture Components: ViewModel / LiveData
的原因 - 这样你就不会想要直接访问视图。您可以在一个地方修改通过ViewModel共享的数据/状态,并且由于LiveData,所有观察者都将使用它进行更新。
因此,您无需直接触摸视图,只需更新数据即可。
public class MyActivity extends AppCompatActivity {
private MyViewModel myViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
myViewModel.myData().observe(this, (data) -> {
if(data == null) return;
updateViews(data);
});
}
}
和
public class MyViewModel extends ViewModel {
public MyViewModel() {}
private MutableLiveData<MyData> mutableData = new MutableLiveData<>();
public LiveData<MyData> myData() {
return mutableData;
}
public void updateData(MyData newData) {
mutableData.postValue(newData);
}
}
和
public class MyFragment extends Fragment {
private MyViewModel myViewModel;
@Override
protected void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
myViewModel = ViewModelProviders.of(getActivity()).get(MyViewModel.class);
myViewModel.myData().observe(getViewLifecycleOwner(), (data) -> {
if(data == null) return;
updateViews(data);
});
}
}
这条路:
- 你不需要像在the official "fragment communication guide"中那样搞乱接口
- 您无需直接触摸视图,只需触摸数据即可
- 你跟上the best practices introduced in 2017的步伐(参见Google I / O 2017的this video和this video)
您也可以在官方指南here中找到这种技术。
这不是一个好习惯。你不应该这样做。 Activity应该自己处理它的视图,你可以使用接口触发该句柄功能。看一下这个。
https://developer.android.com/training/basics/fragments/communicating
做这个:
((YourActivityName)getActivity()).findViewById
或者您可以为视图执行findViewById
并使其在您的活动中全局化,并且可以像访问它一样访问它:
((YourActivityName)getActivity()).viewName
以上是关于在片段中,如何查找活动布局中定义的视图?的主要内容,如果未能解决你的问题,请参考以下文章