在我的活动的布局中,我有一个视图,该视图要从其所附的片段中访问。
我该怎么办?
通常,从片段中查找要在片段布局中定义的视图(所以这是另一个用例),我只是使用inflater
扩大片段的布局,然后调用findVieById
。
但是由于我的视图是在活动的布局中定义的,所以我不能这样做。
我可以使用getActivity().findViewById
吗?
答案 0 :(得分:1)
这不是一个好习惯。你不应该那样做。活动应自行处理其视图,您可以使用界面触发该处理功能。检查一下。
https://developer.android.com/training/basics/fragments/communicating
答案 1 :(得分:1)
在活动的布局中,我有一个视图,我想从其附加片段中访问。
不,你不想。
我该怎么办?
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 best practices introduced in 2017(另请参见Google I / O 2017的this video和this video)
您还可以在官方指南here中找到此技术。
答案 2 :(得分:0)
执行以下操作:
((YourActivityName)getActivity()).findViewById
或者您可以对视图进行findViewById
,并将其设置为活动中的全局视图,并可以像这样访问它:
((YourActivityName)getActivity()).viewName