[英]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);
有多種方法可以在activities
和fragments
之間進行通信,但是,您為它們提供的用法取決於您應用程序的要求。
如果Fragment
初始化需要數據,則可以使用每個fragment
的newInstance
方法作為參數來傳遞數據。
如果需要在runtime
傳遞數據,則需要使用一個interface
,該interface
將使用活動Context
在每個片段的onAttach
方法中進行初始化,並且在每次破壞該片段時將其onAttach
null。
總結第二個選項,您需要:
interface
,最有可能在您正在處理的fragment
。 interface
類型的全局變量。 onAttach
方法中初始化變量。 onDestroy
方法中使變量無效。 activity
實現interface
並處理回調方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.