Java Android-将数据从活动发送到片段
在过去的一天里,我一直在试图弄清楚如何将数据从Java Android-将数据从活动发送到片段,java,android,android-fragments,android-activity,android-fragmentactivity,Java,Android,Android Fragments,Android Activity,Android Fragmentactivity,在过去的一天里,我一直在试图弄清楚如何将数据从活动传递到片段,但没有走多远。我知道如何将数据从片段传递到活动。我认为我不能在我的情况下使用捆绑包,因为我的片段将已经创建,并且需要继续收听活动,以了解任何更改。我也尝试过创建一个接口,但遇到了一些循环错误。对我来说,将数据从Fragment传递到Activity非常容易,我觉得我在过度思考如何将数据从Activity传递回Fragment 这是我试图做的一个简单版本活动位于顶部,底部按钮来自片段布局 当我从MainActivity单击BTN1时,
活动
传递到片段
,但没有走多远。我知道如何将数据从片段
传递到活动
。我认为我不能在我的情况下使用捆绑包,因为我的片段
将已经创建,并且需要继续收听活动
,以了解任何更改。我也尝试过创建一个接口,但遇到了一些循环错误。对我来说,将数据从Fragment
传递到Activity非常容易,我觉得我在过度思考如何将数据从Activity
传递回Fragment
这是我试图做的一个简单版本<代码>活动位于顶部,底部按钮来自片段
布局
当我从MainActivity
单击BTN1时,我希望按钮TESTBTN 1A变为红色,并存储I=1。然后按钮TESTBTN 1B将变为绿色,i=2。按钮TESTBTN 1C将变为蓝色,i=3。单击下一个片段时,它会将片段带到下一个片段(希望不会丢失按钮颜色更改)
以下是我的main活动的主要部分
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);
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);
}
这是我的片段
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);
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);
}
这是我的分区适配器
公共类节SpageAdapter扩展了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();
}
private final List mffragmentlist=new ArrayList();
私有最终列表MFFragmentTitleList=new ArrayList();
public void addFragment(片段片段,字符串标题){
添加(片段);
MFFragmentTitleList.add(标题);
}
公共部分SPAGEAdapter(碎片管理器fm){
超级(fm);
}
@凌驾
公共字符序列getPageTitle(int位置){
返回MFFragmentTitleList.get(位置);
}
@凌驾
公共片段getItem(int位置){
返回MFFragmentList.get(位置);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
非常感谢您对我如何实现将数据从我的活动
发送到片段
以更改按钮颜色的任何帮助!您的代码中的问题是OnDataPass实例必须在您的活动中创建,而不是在片段中创建,因为您希望将数据从活动传递到片段,而不是从片段传递到活动
所以活动和片段类的示例代码块如下所示
public class MainActivity extends AppCompatActivity implements MyFragment.OnDataPass{
MyFragment fragmentInstance;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentInstance = new MyFragment();
}
private void loadMyFragment(){
fragmentInstance = new MyFragment();
//code to load fragment
}
public void passData(String data) {
if (fragmentInstance != null) fragmentInstance.dataFromActivity(data);
}
@Override
public void onDataPass(String data){
//handle data and do the needful. Instead of String you can even use bundle here.
}
}
正如我在评论中提到的,我们创建了一个名为dataFromActivity
的公共方法,您可以从Activity类调用该方法,将活动中的数据传递给片段
public class MyFragment extends Fragment {
OnDataPass dataPasser;
public interface OnDataPass {
void onDataPass(String data);
}
@Override
public void onAttach(Context a) {
super.onAttach(a);
dataPasser = (OnDataPass) a;
}
@Override
public void onDetach() {
super.onDetach();
dataPasser = null;
}
public void passData(String data) {
if (dataPasser != null) dataPasser.onDataPass(data);
}
//method called from Activity
public void dataFromActivity(String data){
//handle data and do the needful. Instead of String you can even use bundle here.
}
}
Fragment将使用OnDataPass
界面将数据从Fragment发送到Activity。试试这个
Main2Activity.java
public class Main2Activity extends Fragment implements View.OnClickListener {
.......
//method to change button background at run time.
public void changeButtonColor(View view){
switch(view.getId()){
case R.id.btnTESTa:
btnTESTa.setBackgroundColor(Color.RED)
i = 1;
break;
case R.id. btnTESTb:
btnTESTb.setBackgroundColor(Color.GREEN)
i = 2;
break;
case R.id. btnTESTc:
btnTESTc.setBackgroundColor(Color.BLUE)
i = 3;
break;
}
}
........
}
public class MainActivity extends AppCompatActivity implements Main2Activity.OnDataPass{
.........
private Main2Activity fragment2;
private Main3Activity fragment3;
private Main4Activity fragment4;
public void onClickBtn1(View v){
fragment2.changeButtonColor(v);
}
public void onClickBtn2(View v){
fragment3.changeButtonColor(v);
}
public void onClickBtn3(View v){
fragment4.changeButtonColor(v);
}
public void onClickBtn4(View v){
//fragment transaction code here
}
private void setupViewPager(ViewPager viewPager) {
.......
fragment2 = new Main2Activity();
fragment3 = new Main3Activity();
fragment4 = new Main4Activity();
adapter.addFragment(fragment2, "TAB1");
adapter.addFragment(fragment3, "TAB2");
adapter.addFragment(fragment4, "TAB3");
.......
}
.......
}
MainActivity.java
public class Main2Activity extends Fragment implements View.OnClickListener {
.......
//method to change button background at run time.
public void changeButtonColor(View view){
switch(view.getId()){
case R.id.btnTESTa:
btnTESTa.setBackgroundColor(Color.RED)
i = 1;
break;
case R.id. btnTESTb:
btnTESTb.setBackgroundColor(Color.GREEN)
i = 2;
break;
case R.id. btnTESTc:
btnTESTc.setBackgroundColor(Color.BLUE)
i = 3;
break;
}
}
........
}
public class MainActivity extends AppCompatActivity implements Main2Activity.OnDataPass{
.........
private Main2Activity fragment2;
private Main3Activity fragment3;
private Main4Activity fragment4;
public void onClickBtn1(View v){
fragment2.changeButtonColor(v);
}
public void onClickBtn2(View v){
fragment3.changeButtonColor(v);
}
public void onClickBtn3(View v){
fragment4.changeButtonColor(v);
}
public void onClickBtn4(View v){
//fragment transaction code here
}
private void setupViewPager(ViewPager viewPager) {
.......
fragment2 = new Main2Activity();
fragment3 = new Main3Activity();
fragment4 = new Main4Activity();
adapter.addFragment(fragment2, "TAB1");
adapter.addFragment(fragment3, "TAB2");
adapter.addFragment(fragment4, "TAB3");
.......
}
.......
}
快乐编码…在Main2活动中添加setter方法,如下所示
public void setDataPasser(OnDataPass dataPasser) {
this.dataPasser = dataPasser;
}
然后在MainActivity中调用此setter方法。
然后在MainActivity中更新以下方法:
private void setupViewPager(ViewPager viewPager) {
SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
Main2Activity fragment = new Main2Activity();
fragment.setListener(this);
adapter.addFragment(fragment, "TAB1");
viewPager.setAdapter(adapter);
有几种方法可以在活动
和片段
之间进行通信,但是,您对它们的使用取决于您的应用程序的要求。
如果Fragment
初始化需要数据,可以使用每个Fragment
的newInstance
方法作为一个或多个参数传递数据。
如果需要在运行时
中传递数据,则需要使用接口
,该接口将在使用活动上下文
的每个片段的onAttach
方法中初始化,并在每次片段被销毁时变为null。
要总结第二个选项,您需要:
声明一个接口
,很可能在您正在处理的片段内
声明接口
类型的全局变量
在片段的onAttach
方法中初始化变量
在onDestroy
方法中将变量置零
调用所需按钮中的接口方法
在活动
中实现接口
,并处理回调方法
活动代码中的片段实例在哪里?为什么不能只调用该片段上的方法?请暂时删除ViewPager。这只是一件复杂的事情。您可以在片段中创建一个公共方法,并使用您创建的片段实例调用它。顺便提一下,Main2Activity extensed Fragment
,不是活动。请修复y我们的类命名约定如果你想让其他人理解代码,为什么要让这个简单的任务变得复杂,只需使用一个界面并传递相应按钮的id,然后相应地更改代码中的颜色fragment@cricket_007刚刚添加了片段实例…或者至少是我认为的。对不起,刚刚开始学习ng关于片段,仍然对所有事情有点困惑。实际上我确实想将数据从一个片段传递到另一个活动。但我也想将数据从一个活动传递到另一个片段。这似乎是一项非常简单的任务,但我无法理解。检查修改后的代码,现在您可以同时完成这两项任务,即可以将数据从一个活动传递到另一个片段,也可以将数据传递到另一个活动.