【发布时间】:2017-12-16 08:51:58
【问题描述】:
过去一天,我一直试图弄清楚如何将数据从Activity 传递到Fragment,但还没有走多远。我知道如何将数据从Fragment 传递到Activity。我认为我不能针对我的情况使用捆绑包,因为我的 Fragment 已经创建,并且需要继续收听 Activity 进行任何更改。我也尝试过创建一个界面,但我得到了一些循环错误。将数据从 Fragment 传递到 Activity 对我来说非常容易,我觉得我在考虑如何将数据从 Activity 传递回 Fragment。
这是我正在尝试做的一个简单版本。 Activity 位于顶部,底部按钮来自 Fragment 布局。
当我从MainActivity单击 BTN1 时,我希望按钮 TESTBTN 1A 变为红色并存储 i = 1。然后按钮 TESTBTN 1B 将变为绿色且 i = 2。按钮 TESTBTN 1C 将更改变为蓝色并且 i = 3。当单击 NEXT FRAGMENT 时,它会将 Fragment 带到下一个(希望不会丢失按钮颜色更改)。
这是我MainActivity的主要部分
public class MainActivity extends AppCompatActivity implements Main2Activity.OnDataPass{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.container);
setupViewPager(mViewPager);
}
public void onClickBtn1(View v){
//need to send data over to fragment1 to be stored and to change color
}
public void onClickBtn2(View v){
//need to send data over to fragment1 to be stored and to change color
}
public void onClickBtn3(View v){
//need to send data over to fragment1 to be stored and to change color
}
public void onClickBtn4(View v){
//go to next fragment
}
//used for when fragment passes data to activity
@Override
public void onDataPass(String data) {
Log.d("LOG", "passed data: " + data);
}
private void setupViewPager(ViewPager viewPager) {
SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
adapter.addFragment(new Main2Activity(), "TAB1");
adapter.addFragment(new Main3Activity(), "TAB2");
adapter.addFragment(new Main4Activity(), "TAB3");
viewPager.setAdapter(adapter);
这是我的Fragment
public class Main2Activity extends Fragment implements View.OnClickListener {
int i;
Button btnTESTa, btnTESTb, btnTESTc;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_main2,container,false);
btnTESTa = view.findViewById(R.id.btnTESTa);
btnTESTb = view.findViewById(R.id.btnTESTb);
btnTESTc = view.findViewById(R.id.btnTESTc);
btnTESTa.setOnClickListener(this);
btnTESTb.setOnClickListener(this);
btnTESTc.setOnClickListener(this);
return view;
}
//NEED TO CREATE A WAY TO LISTEN FOR DATA SENT OVER FROM ACTIVITY TO CHANGE BUTTON COLORS AND STORE INT I VALUE
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnTESTa:
i = 0;
break;
case R.id.btnTESTb:
i = 1;
break;
case R.id.btnTESTc:
i = 2;
break;
}
passData(String.valueOf(i));
}
//used to pass data over from fragment to activity
OnDataPass dataPasser;
public interface OnDataPass {
void onDataPass(String data);
}
@Override
public void onAttach(Context a) {
super.onAttach(a);
dataPasser = (OnDataPass) a;
}
public void passData(String data) {
dataPasser.onDataPass(data);
}
这是我的 SectionsPageAdapter 公共类 SectionsPageAdapter 扩展 FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
public SectionsPageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
非常感谢任何有关如何实现将数据从Activity 发送到Fragment 以更改按钮颜色的帮助,谢谢!
【问题讨论】:
-
Activity 代码中的 Fragment 实例在哪里?为什么不能只调用该片段上的方法?暂时删除 ViewPager。这只是复杂的事情
-
您可以在片段中创建一个公共方法并使用您创建的片段实例调用它。
-
顺便说一下,
Main2Activity extends Fragment不是 Activity。如果您希望其他人理解代码,请修正您的类命名约定 -
你为什么要把这个简单的任务复杂化,只需使用一个界面并为相应的按钮单击传递 id 并相应地更改片段内的颜色
-
@cricket_007 刚刚添加了片段实例......或者至少我认为它是。抱歉,刚开始学习 Fragments,对一切还有些迷茫
标签: java android android-fragments android-activity android-fragmentactivity