簡體   English   中英

Java Android-將數據從活動發送到片段

[英]Java Android - Send data from activity to fragment

在過去的一天里,我一直在努力尋找如何將數據從“ 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.單擊“下一個Fragment ,它將把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發送數據以更改按鈕顏色的幫助,謝謝!

代碼中的問題是,必須在活動中創建OnDataPass實例,而不是片段,因為要將數據從活動傳遞到片段而不是片段到活動。

因此,Activity和Fragment類的示例代碼塊將像這樣。

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類中調用該方法,以將數據從Activity傳遞到Fragment。

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;
      }
   }
 ........
 }

MainActivity.java

 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");
        .......
   }
   .......
 }

祝您編程愉快...

在Main2Activity中添加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);

有多種方法可以在activitiesfragments之間進行通信,但是,您為它們提供的用法取決於您應用程序的要求。
如果Fragment初始化需要數據,則可以使用每個fragmentnewInstance方法作為參數來傳遞數據。
如果需要在runtime傳遞數據,則需要使用一個interface ,該interface將使用活動Context在每個片段的onAttach方法中進行初始化,並且在每次破壞該片段時將其onAttach null。
總結第二個選項,您需要:

  1. 聲明一個interface ,最有可能在您正在處理的fragment
  2. 聲明interface類型的全局變量。
  3. 在片段的onAttach方法中初始化變量。
  4. onDestroy方法中使變量無效。
  5. 在所需的按鈕中調用接口方法。
  6. activity實現interface並處理回調方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM