Как получить доступ к менеджеру фрагментов (или хостингу) из докладчика - PullRequest
0 голосов
/ 07 сентября 2018

Мне нужен доступ к менеджеру фрагментов (или деятельности) от моего докладчика. Как я могу получить к нему доступ? Сам докладчик вызывается из другого докладчика, который, в свою очередь, вызывается из фрагмента. Как я могу получить доступ к менеджеру фрагментов или хостингу от докладчика? Нужно ли реализовывать интерфейс? Заранее спасибо.

public class EPGTitleRowPresenter extends Presenter {

private final static String TAG = EPGTitleRowPresenter.class.getSimpleName();
private Context mContext;

private static int sSelectedBackgroundColor;
private static int sDefaultBackgroundColor;

public EPGTitleRowPresenter(Context context) {
    mContext = context;

}

private View.OnFocusChangeListener mOnFocusChangeListener = new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            updateEPGTitleRowBackgroundColor(v, true);
        }
        else {
            updateEPGTitleRowBackgroundColor(v, false);
        }
    }
};

private View.OnClickListener mOnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        VerticalGridView vgv = (VerticalGridView) v.getParent();
        int pos = vgv.getSelectedPosition();

        if (pos > 0) {
            //TODO: mark programme for auto-switch
        }
        else {
            //TODO: switch to channel

        }
    }
};

private static void updateEPGTitleRowBackgroundColor(View view, boolean selected) {
    int color = selected ? sSelectedBackgroundColor : sDefaultBackgroundColor;
    // Both background colors should be set because the view's background is temporarily visible
    // during animations.
    view.setBackgroundColor(color);
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
    EPGTitleRowView view = new EPGTitleRowView(parent.getContext()) {
        @Override
        public void setSelected(boolean selected) {
            Log.i(TAG, "setSelected called");
            super.setSelected(selected);
        }
    };
    view.setMinimumWidth(parent.getWidth());

    sDefaultBackgroundColor =
            ContextCompat.getColor(parent.getContext(), android.R.color.transparent);

    sSelectedBackgroundColor =
            Color.parseColor("#66ffe680");

    view.setFocusable(true);
    view.setFocusableInTouchMode(true);
    updateEPGTitleRowBackgroundColor(view, false);

    view.setOnClickListener(mOnClickListener);
    view.setOnFocusChangeListener(mOnFocusChangeListener);

    return new ViewHolder(view);
}

@CallSuper
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
    final Programme prog = (Programme) item;
    ViewHolder vh = (ViewHolder) viewHolder;

    vh.mProgrammeTitle.setText(prog.getTitle().get(0));

    Date startDateTime = new Date(prog.getStart_utc() * 1000l);
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
    String strStartTime = sdf.format(startDateTime);
    vh.mProgrammeStartTime.setText(strStartTime);
}


public class ViewHolder extends Presenter.ViewHolder {
    public EPGTitleRowView mRootView;
    public TextView mProgrammeTitle;
    public TextView mProgrammeStartTime;

    public ViewHolder(View view) {
        super(view);
        mRootView = (EPGTitleRowView) view;
        mProgrammeTitle = (TextView) view.findViewById(R.id.programme_title);
        mProgrammeStartTime = (TextView) view.findViewById(R.id.programme_start_time);
    }
}


public class EPGTitleRowView extends FrameLayout {

    public EPGTitleRowView(Context context) {
        super(context);

        setFocusable(true);
        setFocusableInTouchMode(true);

        LayoutInflater inflater = LayoutInflater.from(getContext());
        inflater.inflate(R.layout.epg_title_row, this);
    }
}

}

1 Ответ

0 голосов
/ 07 сентября 2018

Если вы используете докладчик, я предполагаю, что вы работаете с шаблоном MVP. В этом случае лучше хранить код как можно дальше от компонентов Android (например, фрагмента менеджера) для лучшей развязки.

Мое предложение состояло бы в том, чтобы вызвать метод в представлении (при условии, что представление является действием), и представление должно быть известно докладчику, таким образом, вы можете использовать и интерфейс для представления (которое вы, вероятно, используете )

Примерно так:

public interface MyView {
    void methodToUseFragmentManager();
}

Докладчик должен знать об этом, чтобы он выглядел так:

MyView view:
public EPGTitleRowPresenter (MyView view){
    this.view = view;
}

void methodToUpdateView(){
     view.methodToUseFragmentManager();
}

И, наконец, внедрите этот интерфейс в свою деятельность:

public class MyActivity extends AppCompatActivity implements MyView{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        presenter = new EPGTitleRowPresenter(this);
    }

    @Override
    void methodToUseFragmentManager(){
        // Here you can access the FragmentManager
    }
}

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

EDIT

Если у вас более 1 докладчика, допустим, у вас есть 2: parentPresenter и childPresenter, то есть EPGTitleRowPresenter, дочерний элемент

Таким образом, ваш родительский подарок должен выглядеть так:

MyView view:
EPGTitleRowPresenter childPresenter;
public ParentPresenter (MyView view){
    this.view = view;
    childPresenter = new EPGTitleRowPresenter(view);
}

и дочерний элемент (EPGTitleRowPresenter) будет таким же, как в исходном ответе.

Ваша деятельность будет выглядеть так:

public class MyActivity extends AppCompatActivity implements MyView{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        presenter = new ParentPresenter(this);
    }

    @Override
    void methodToUseFragmentManager(){
        // Here you can access the FragmentManager
    }
}
...