Java 如何使用ViewModel在片段之间共享数据

Java 如何使用ViewModel在片段之间共享数据,java,android,viewmodel,Java,Android,Viewmodel,我有一个主片段,在主片段中,我有一个由嵌套片段(细节片段和摘要片段)组成的ViewPager。如果单击主片段中的按钮,数据将在ViewPager的主片段和详细片段中设置。问题是如何从主要片段中获取数据,这些数据可以在详细片段中使用 我尝试在主片段中使用ViewModel。假设数据应该以细节片段的形式传递 //主要片段 private void initializeViewPager() { vpExpenses.setOffscreenPageLimit(2); setupVie

我有一个主片段,在主片段中,我有一个由嵌套片段(细节片段和摘要片段)组成的ViewPager。如果单击主片段中的按钮,数据将在ViewPager的主片段和详细片段中设置。问题是如何从主要片段中获取数据,这些数据可以在详细片段中使用

我尝试在主片段中使用ViewModel。假设数据应该以细节片段的形式传递

//主要片段

private void initializeViewPager()
{
    vpExpenses.setOffscreenPageLimit(2);
    setupViewPager(vpExpenses);
}

private void setupViewPager(final ViewPager viewPager)
{
    adapter = new ViewPagerWithTitleAdapter(getFragmentManager());
    adapter.addFragment(new ExpensesDetailsListFragment(), "Detail");
    adapter.addFragment(new ExpensesSummaryListFragment(), "Summary");
    viewPager.setAdapter(adapter);

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
    {
        @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
        @Override public void onPageScrollStateChanged(int state) { }
        @Override public void onPageSelected(int position) {
            if(position == 0)
            {
                tvDetailExpenses.setSelected(true);
                tvSummaryExpenses.setSelected(false);
            }
            else if(position == 1)
            {
                tvDetailExpenses.setSelected(false);
                tvSummaryExpenses.setSelected(true);
            }
        }
    });

    tvDetailExpenses.setSelected(true);
    viewPager.setCurrentItem(0);

    tvDetailExpenses.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)
        {
            viewPager.setCurrentItem(0,false);
        }
    });

    tvSummaryExpenses.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            viewPager.setCurrentItem(1,false);
        }
    });

}

//Expenses Details List
private void setupExpensesDetailsList(String expenseCategoryId)
{
    expensesViewModel = ViewModelProviders.of(this.getActivity()).get(ExpensesViewModel.class);
    expensesViewModel.setToken(token);
    expensesViewModel.setUserId(userId);
    expensesViewModel.setDeviceId("ABCDE1234567890");
    expensesViewModel.setCarId("24");
    expensesViewModel.setExpensesId(expenseCategoryId);

    getExpensesDetailsList();
}

public void getExpensesDetailsList()
{
    expensesViewModel.getExpensesDetailsList().observe(this, expensesdetailslistObserver);
}

public Observer<ExpensesDetailsListResult> expensesdetailslistObserver = new Observer<ExpensesDetailsListResult>() {
    @Override
    public void onChanged(@Nullable ExpensesDetailsListResult result)
    {
        if(result.getStatus())
        {
            summary = result.getData().getSummary();

            tvTotalExpenses.setText("RM"+summary.getYearly());
            tvExpensesPerDay.setText("/ "+summary.getDaily_avg()+" per day");
        }
        else
        {
            if(!result.getStatus())
            {
                if(result.getCode() == 300)
                {
                    new MaterialDialog.Builder(getActivity())
                            .title("Failed")
                            .content(result.getMsg())
                            .positiveText("OK")
                            .show();
                }
                else if(result.getCode() == 302)
                {
                    new MaterialDialog.Builder(getActivity())
                            .title("Failed")
                            .content(result.getMsg())
                            .positiveText("OK")
                            .show();
                }
            }

            if(result.getRedirectLogin() != null)
            {
                if (result.getRedirectLogin())
                {
                    func.showErrorExpired();
                }
            }
        }
    }
};
private void initializeviewpage()
{
VP.setOffscreenPageLimit(2);
setupViewPager(VP);
}
专用无效设置ViewPager(最终ViewPager ViewPager)
{
adapter=newviewpagerwithtitleadapter(getFragmentManager());
adapter.addFragment(新开支detailslistFragment(),“Detail”);
addFragment(新的ExpenseSummaryListFragment(),“摘要”);
viewPager.setAdapter(适配器);
viewPager.addOnPageChangeListener(新的viewPager.OnPageChangeListener()
{
@覆盖已滚动页面上的公共空白(int-position、float-positionOffset、int-positionOffsetPixels){}
@重写公共无效onPageScrollStateChanged(int-state){}
@覆盖选定页面上的公共无效(内部位置){
如果(位置==0)
{
tvDetailExpenses.setSelected(true);
tvSummaryExpenses.setSelected(假);
}
否则如果(位置==1)
{
TVTailExpenses.setSelected(假);
tvSummaryExpenses.setSelected(true);
}
}
});
tvDetailExpenses.setSelected(true);
viewPager.setCurrentItem(0);
tvDetailExpenses.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v)
{
viewPager.setCurrentItem(0,false);
}
});
tvSummaryExpenses.setOnClickListener(新视图.OnClickListener()中){
@凌驾
公共void onClick(视图v){
viewPager.setCurrentItem(1,false);
}
});
}
//费用明细表
私有无效设置ExpenseSdetailsList(字符串expenseCategoryId)
{
expensesViewModel=ViewModelProviders.of(this.getActivity()).get(expensesViewModel.class);
expensesViewModel.setToken(令牌);
expensesViewModel.setUserId(userId);
费用VIEWMODEL.setDeviceId(“ABCDE1234567890”);
费用见setCarId模型(“24”);
expensesViewModel.setExpensesId(expenseCategoryId);
getExpensesDetailsList();
}
公共无效getExpensesDetailsList()
{
expensesViewModel.getExpensesDetailsList().observe(这是expensesdetailslistObserver);
}
公共观察者费用detailslistobserver=新观察者(){
@凌驾
更改后的公共无效(@Nullable ExpenseSDetailsResult结果)
{
if(result.getStatus())
{
summary=result.getData().getSummary();
tvotalExpenses.setText(“RM”+summary.getYear());
tvpensesperday.setText(“/”+summary.getDaily_avg()+”每天”);
}
其他的
{
如果(!result.getStatus())
{
if(result.getCode()==300)
{
new MaterialDialog.Builder(getActivity())
.标题(“失败”)
.content(result.getMsg())
.positiveText(“确定”)
.show();
}
else if(result.getCode()==302)
{
new MaterialDialog.Builder(getActivity())
.标题(“失败”)
.content(result.getMsg())
.positiveText(“确定”)
.show();
}
}
if(result.getRedirectLogin()!=null)
{
if(result.getRedirectLogin())
{
函数()的作用;
}
}
}
}
};
//细节片段

private ExpensesDetailsListResult expensesDetails;
private List<ExpensesTypes> listExpensesType;

private Unbinder unbinder;
private ExpensesViewModel expensesViewModel;

private Function func;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_expenses_list_details, container, false);
    unbinder = ButterKnife.bind(this, view);
    func = new Function(getActivity());

    expensesViewModel = ViewModelProviders.of(this.getActivity()).get(ExpensesViewModel.class);

    expensesViewModel.getExpensesDetailsList().observe(this, item -> {
        //expensesDetails = expensesViewModel.setExpensesDetailsList(item);
    });

    return view;
}
私人支出明细结果支出明细;
私有列表ListExpenseSype;
私人无障碍者;
私人支出IEWMODEL支出IEWMODEL;
私有函数函数;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态)
{
视图=充气机。充气(R.layout.fragment\u expenses\u list\u details,container,false);
unbinder=ButterKnife.bind(这个,视图);
func=新函数(getActivity());
expensesViewModel=ViewModelProviders.of(this.getActivity()).get(expensesViewModel.class);
expensesViewModel.getExpensesDetailsList()。观察(此,项->{
//expensesDetails=expensesViewModel.SetExpensesDetails列表(项目);
});
返回视图;
}
//视图模型

public ExpensesViewModel(@NonNull Application application)
{
    super(application);
}

public void setToken(String token)
{
    this.token = token;
}

public void setUserId(String userId)
{
    this.userId = userId;
}

public void setDeviceId(String deviceId)
{
    this.deviceId = deviceId;
}

public void setCarId(String carId)
{
    this.carId = carId;
}

public void setExpensesId(String expensesId)
{
    this.expensesId = expensesId;
}

//THIS IS THE MAIN FUNCTION THAT UI CONTROLLER CAN OBSERVE FOR CHANGES

//Expenses Category
public MutableLiveData<ExpensesCategoryResult> getExpensesCategory()
{
    expensescategoryObservable = ExpensesRepository.getInstance().getExpensesCategory(token, userId, deviceId);
    return expensescategoryObservable;
}

//Expenses Details List
public MutableLiveData<ExpensesDetailsListResult> getExpensesDetailsList()
{
    expensesdetailslistObservable = ExpensesRepository.getInstance().getExpensesDetailsList(token, userId, deviceId, carId, expensesId, "1");
    return expensesdetailslistObservable;
}
public ExpensesViewModel(@NonNull应用程序)
{
超级(应用);
}
公共void setToken(字符串令牌)
{
this.token=token;
}
public void setUserId(字符串userId)
{
this.userId=userId;
}
公共无效setDeviceId(字符串deviceId)
{
this.deviceId=deviceId;
}
公共无效设置carId(字符串carId)
{
this.carId=carId;
}
public void setExpensesId(字符串expensesId)
{
this.expensesId=expensesId;
}
//这是UI控制器可以观察更改的主要功能
//费用类别
公共可变LiveData getExpensesCategory()
{
expensescategoryObservable=ExpenseSresposition.getInstance().getExpensesCategory(令牌、用户ID、设备ID);
可观察的回报费用;
}
//费用明细表
公共可变LiveData getExpensesDetailsList()
{
expensesdetailslistObservable=ExpenseSresposition.getInstance().getExpensesDetailsList(令牌、用户ID、设备ID、carId、expensesId,“1”);
无法观察到的退货费用;
}
你是pas
// Get the View Model with the Activity as the owner
expensesViewModel = ViewModelProviders.of(getActivity()).get(ExpensesViewModel.class);

// Observe the LiveData by passing in the Activity as the owner, & the observer
expensesViewModel.getExpensesDetailsList().observe(getActivity(),  new Observer<ExpensesDetailsListResult>(){
    @Override
    public void onChanged(ExpensesDetailsListResult result) {
        // Do something with the data according to which Fragment this is in
    }
});