TabLayout、ViewPager、および2つのフラグメントを含む単純なアクティビティがあります。私の活動は次のとおりです。
_public class ManagementCompanyOverviewActivity extends BaseActivity implements ManagementCompanyOverviewView {
private ManagementCompanyVPAdapter mVPAdapter;
private TabLayout mTLContent;
private ViewPager mVPContent;
@InjectPresenter
ManagementCompanyPresenter mPresenter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_management_company);
mVPAdapter = new ManagementCompanyVPAdapter(getSupportFragmentManager());
mTLContent = (TabLayout) findViewById(R.id.tl_company_content);
mVPContent = (ViewPager) findViewById(R.id.vp_company_content);
mVPContent.setAdapter(mVPAdapter);
mTLContent.setupWithViewPager(mVPContent);
}
@Override
public void onAboutCompanyInfoReceivedFromServer(AboutCompanyViewModel model) {
}
_
アクティビティにはプレゼンター(私はMoxyを使用しています)があり、プレゼンターはリクエストを送信し、回答を取得し、JavaObject(ビューモデル)を作成し、getViewState()
でこのモデルをアクティビティに渡します。このモデルをアクティビティからフラグメントの1つに渡す必要があります。
_Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_about_company, container, false);
mTVName = (TextView) view.findViewById(R.id.tv_company_name);
mTVDirector = (TextView) view.findViewById(R.id.tv_company_director);
mTVWebsite = (TextView) view.findViewById(R.id.tv_company_website);
mTVEmail = (TextView) view.findViewById(R.id.tv_company_email);
mTVPhone = (TextView) view.findViewById(R.id.tv_company_phone);
mTVSchedule = (TextView) view.findViewById(R.id.tv_company_schedule);
mTVAddress = (TextView) view.findViewById(R.id.tv_company_address);
return view;
}
_
このフラグメントには、モデルからの情報を表示するTextViewがいくつかあります。このモデルを渡す方法は?私はそれを正しく知っている場合、リスナーを作成する必要がありますが、どのように? emを使用する方法が完全にはわかりません。
さて、私はこれをやった。
1ステップ:Activityにパブリックインターフェイスを作成し、そのためのセッターを作成しました。
private OnAboutDataReceivedListener mAboutDataListener;
public interface OnAboutDataReceivedListener {
void onDataReceived(AboutCompanyViewModel model);
}
public void setAboutDataListener(OnAboutDataReceivedListener listener) {
this.mAboutDataListener = listener;
}
2ステップ:このインターフェイスをフラグメントに実装し、リスナーを設定しました。
public class AboutCompanyFragment extends BaseFragment implements ManagementCompanyOverviewActivity.OnAboutDataReceivedListener
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = (ManagementCompanyOverviewActivity) getActivity();
mActivity.setAboutDataListener(this);
}
3ステップ:インターフェースのメソッドをオーバーライドしました:
@Override
public void onDataReceived(AboutCompanyViewModel model) {
mPBName.setVisibility(View.INVISIBLE);
mPBDirector.setVisibility(View.INVISIBLE);
mPBWebsite.setVisibility(View.INVISIBLE);
mPBEmail.setVisibility(View.INVISIBLE);
mPBPhone.setVisibility(View.INVISIBLE);
mPBSchedule.setVisibility(View.INVISIBLE);
mPBAddress.setVisibility(View.INVISIBLE);
mTVName.setVisibility(View.VISIBLE);
mTVDirector.setVisibility(View.VISIBLE);
mTVWebsite.setVisibility(View.VISIBLE);
mTVEmail.setVisibility(View.VISIBLE);
mTVPhone.setVisibility(View.VISIBLE);
mTVSchedule.setVisibility(View.VISIBLE);
mTVAddress.setVisibility(View.VISIBLE);
mTVName.setText(model.getCompanyName());
mTVDirector.setText(model.getDirectorName());
mTVWebsite.setText(model.getWebsite());
mTVEmail.setText(model.getEmail());
mTVPhone.setText(model.getPhone());
mTVSchedule.setText(model.getWorkTime());
mTVAddress.setText(model.getAddress());
}
それでおしまい。
フラグメントでnewInstanceメソッドを使用できます。
_public static MyFragment newInstance(String parameter) {
Bundle args = new Bundle();
args.putString("parameter", parameter);
SfCategoryFragment fragment = new SfCategoryFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
parameter = getArguments().getString("parameter");
}
}
_
そしてあなたの活動では:
new MyFragment()
の代わりにMyFragment.newInstance("yourParam");
を使用します
アクティビティでこれを試してください
public String sendData() {
return YOUR_STRING;
}
フラグメントで
YOUR_ACTIVITY activity = (YOUR_ACTIVITY) getActivity();
String getData = activity.SendData();
アダプターのコンストラクターで、フラグメントに表示するデータを取得し、新しいフラグメントを返す前に引数を設定することもできます
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private Weather weather;
ViewPagerAdapter(FragmentManager fm, Weather weather) {
super(fm);
this.weather = weather;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
Bundle bundle = new Bundle();
WeatherFragment weatherFragment = new WeatherFragment();
bundle.putParcelable("weather", weather);
weatherFragment.setArguments(bundle);
return weatherFragment;
case 1:
return new PoemFragment();
default:
return new EmptyFragment();
}
}
アクティビティまたはViewPagerから
Bundle bundle = new Bundle();
bundle.putParcelable(Keys.KEY_ITEM, cardResult);
CardItemFragment cardItemFragment = new CardItemFragment();
cardItemFragment.setArguments(bundle);
フラグメントから
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
getBundle();
}
private void getBundle() {
bundle = getArguments();
if (null != bundle) {
if (bundle.containsKey(Keys.KEY_ITEM)) {
cardResult = bundle.getParcelable(Keys.KEY_ITEM);
}
}
}