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关于片段,仍然对所有事情有点困惑。实际上我确实想将数据从一个片段传递到另一个活动。但我也想将数据从一个活动传递到另一个片段。这似乎是一项非常简单的任务,但我无法理解。检查修改后的代码,现在您可以同时完成这两项任务,即可以将数据从一个活动传递到另一个片段,也可以将数据传递到另一个活动.