Как управлять представлениями во фрагменте из другого фрагмента с помощью интерфейса - PullRequest
0 голосов
/ 10 января 2019

Я создаю приложение-генератор мемов. Имеет 2 fragments.

1-й фрагмент имеет 2 TextViews и an ImageView ниже.
2-й фрагмент имеет 2 EditTexts и 2 Buttons.

ImageView в первом фрагменте, который можно кликнуть, содержит изображение-заполнитель.

1 - Я хочу изменить видимость упомянутых видов во 2-м фрагменте на gone, если другое изображение не выбрано

2- Я хочу сделать это, проверив имя файла для рисования.

Мне сказали, что я должен использовать интерфейс для этого.

Как использовать интерфейс для выполнения заказов?

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

public class BottomControlsFragment extends Fragment {

    EditText topEditText, bottomEditText;
    Button btnCreate, btnReset;

    BottomControlsListener activityCommander;

    public interface BottomControlsListener{ void createMeme(String top, String bottom);}

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        try{activityCommander = (BottomControlsListener) context;}

        catch (ClassCastException e){throw new ClassCastException(context.toString());}
    }

public class MainActivity extends AppCompatActivity implements BottomControlsFragment.BottomControlsListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void createMeme(String top, String bottom) {
        TopImageFragment topImageFragment = (TopImageFragment)getSupportFragmentManager().findFragmentById(R.id.fragment1);
        topImageFragment.setMemeText(top, bottom);
    }
}

public class TopImageFragment extends Fragment {

    ...

    public void setMemeText(String top, String bottom){
        topTextView.setText(top);
        bottomTextView.setText(bottom);
    }

    ...

}

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Ну, как говорится в документе Google:

Рекомендуемый способ связи между фрагментами - создать общий объект ViewModel. Оба фрагмента могут получить доступ к ViewModel через содержащую их активность. Фрагменты могут обновлять данные в ViewModel, и если данные предоставляются с использованием LiveData, новое состояние будет передано другому фрагменту, пока он наблюдает LiveData из ViewModel. Чтобы узнать, как реализовать этот вид связи, прочитайте раздел «Обмен данными между фрагментами» в руководстве по ViewModel.

Я рекомендую вам это сделать. Это как это делается.

Во-первых, вам нужно создать вашу viewModel:

public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

public void select(Item item) {
    selected.setValue(item);
}

public LiveData<Item> getSelected() {
    return selected;
}
}

После этого вы можете использовать его в обоих своих фрагментах:

public class FirstFragment extends Fragment {
    private SharedViewModel model;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}


public class SecondFragment extends Fragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, { item ->
           // Update the UI.
        });
    }
}

Легко использовать. Дайте мне знать, если у вас возникли проблемы.

0 голосов
/ 10 января 2019

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

  1. сделать широковещательный приемник для изменения видимости во 2-м фрагменте
  2. зарегистрировать получателя широковещания в onResume по экземпляру LocalBroadcastManager и отменить регистрацию в onPause
  3. проверка на разностное изображение в 1-м фрагменте, когда notChanged отправляет намерение с зарегистрированным действием во 2-м фрагменте onResume, экземпляром LocalBroadcastManager. Для получения дополнительной информации, ознакомьтесь с примерами на Google

Обновление: также, если вы хотите использовать интерфейсы, Вот полное руководство

...