В макете моей деятельности у меня есть представление, к которому я бы хотел получить доступ из прикрепленного фрагмента.
Нет, вы не хотите.
Как я мог это сделать?
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);
});
}
}
Таким образом:
Вы также можете найти эту технику в официальных руководствах здесь .