Во фрагменте, как найти представление, определенное в макете действия? - PullRequest
0 голосов
/ 10 марта 2019

В макете моей активности у меня есть представление, к которому я хочу получить доступ к из прикрепленного фрагмента.

Как я мог это сделать?

Обычно, из фрагмента , чтобы найти представление, определенное в макете фрагмента (так что это еще один вариант использования), я просто использую inflater для надувания макета фрагмента и позвоните findVieById.

Но поскольку мое представление определено в макете действия, я не могу этого сделать.

Могу ли я использовать getActivity().findViewById?

Ответы [ 3 ]

1 голос
/ 10 марта 2019

Это не очень хорошая практика.Ты не должен этого делать.Действие должно обрабатывать свое представление самостоятельно, и вы можете вызвать эту функцию обработки с помощью интерфейса.Проверьте это.

https://developer.android.com/training/basics/fragments/communicating

1 голос
/ 10 марта 2019

В макете моей деятельности у меня есть представление, к которому я бы хотел получить доступ из прикрепленного фрагмента.

Нет, вы не хотите.

Как я мог это сделать?

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);
        });
    }
}

Таким образом:

Вы также можете найти эту технику в официальных руководствах здесь .

0 голосов
/ 10 марта 2019

Сделайте это:

((YourActivityName)getActivity()).findViewById

или вы можете сделать findViewById для представления, сделать его глобальным в своей деятельности и получить к нему доступ, например:

((YourActivityName)getActivity()).viewName
...