2017-06-22 46 views
0

我有兩個包含兩個不同片段的標籤。 Tab1對於fragment1tab2對於fragment2。從fragment1,我想通過點擊一個按鈕傳遞fragment2的TextView中的字符串值。 但是,fragment2的UI未更新。示例代碼如下。帶有標籤的片段UI沒有被更新

在MainActivity:

private Fragment1 fragment1; 
private Fragment2 fragment2; 
private TabLayout tabLayout; 

protected void onCreate(Bundle savedInstanceState) { 

    fragment1 = new Fragment1(); 
    fragment2 = new Fragment2(); 

    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_holder, fragment1).commit(); 

    tabLayout = (TabLayout) findViewById(R.id.tab); 
    tabLayout.getTabAt(0).select(); 
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      if (tab.getPosition() == 0) { 
       getSupportFragmentManager().beginTransaction().replace(R.id.fragment_holder, fragment1).commit(); 
      } else if (tab.getPosition() == 1) { 
       getSupportFragmentManager().beginTransaction().replace(R.id.fragment_holder, fragment2).commit(); 
      } 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    } 

} 

public void showFragment2(final String data) { 
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_holder, fragment2).commit(); 
    tabLayout.getTabAt(1).select(); 
    if (!TextUtils.isEmpty(data)) { 
     if (fragment2 != null) { 
      fragment2.setData(data); 
     } 
    } 
} 

在片段1:

private Button button; 

protected void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 

    button = (Button) view.findViewById(R.id.btn); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ((MainActivity)getActivity()).showFragment2("Updated Data"); 
     } 
    }); 
} 

在Fragment2:

private TextView tv; 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    tv = (TextView) view.findViewById(R.id.tv); 
} 

public void setData(String data){ 
    tv.setText(data); 
} 

重要更新: 如果我在處理程序更新UI。然後它工作。但是,似乎這不是正確的方法。

handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      tabLayout.getTabAt(1).select(); 
      if(!TextUtils.isEmpty(data)){ 
       if(fragment2 != null){ 
        fragment2.setData(data); 
       } 
      } 
     } 
    },500); 

回答

1

使用.executePendingTransactions()這將與.commit()採用異步沿同步工作。一個FragmentTransaction與 FragmentTransaction.commit()致力於

之後,它計劃進程的主線程上執行 異步。如果要 立即執行任何此類未決操作,則可以調用此函數(僅限於主線程) 來執行此操作。請注意,所有回調 和其他相關行爲都將在此調用中完成,因此請謹慎調用 。

DO:

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_holder, fragment2).commit(); 
    getSupportFragmentManager().executePendingTransactions(); 
    tabLayout.getTabAt(1).select(); 
    if(!TextUtils.isEmpty(data)){ 
      if(fragment2 != null){ 
       fragment2.setData(data); 
      } 
    } 
+0

我很害怕,我沒有發現什麼叫設置在片段.executePendingTransactions()代替.commit() –

+0

請參閱更新的代碼片段。 –

+0

謝謝你......它的工作原理。乾杯!! –

0

喂您好我是不知道,但嘗試這個辦法:

public void showFragment2(final String data) { 

     if (!TextUtils.isEmpty(data)) { 
      if (fragment2 != null) { 
//    fragment2.setData(data); 
       Bundle arguments = new Bundle(); 
       arguments.putString("string_key" , data); 
       fragment2.setArguments(arguments); 
      } 
     } 

     getSupportFragmentManager().beginTransaction().replace(R.id.fragment_holder, fragment2).commit(); 
     tabLayout.getTabAt(1).select(); 
    } 

,並在Fragment2:

private TextView tv; 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     Bundle arguments = getArguments(); 
     String desired_string = arguments.getString("string_key"); 

     tv = (TextView) view.findViewById(R.id.tv); 

     setData(desired_string); 

     } 

public void setData(String data){ 
     tv.setText(data); 
     } 
0

設置活動的數據方法從片段1和加載fra gment從活動獲得的數據和片段1 2

mainActivity(){ 
string fragment1Data; 

public void setFragment1Data(string data){ 
fragment1Data = data; 
} 

public string getFragment1Data(){ 
return fragment1Data 
} 
} 

在片段

private Button button; 
protected void onViewCreated(View view, @Nullable Bundle savedInstanceState) 
{ 

button = (Button) view.findViewById(R.id.btn); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     ((MainActivity)getActivity()).showFragment2("Updated Data"); 
     ((MainActivity)getActivity()).setFragment1Data("data"); 
    } 
}); 
} 
private TextView tv; 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
super.onViewCreated(view, savedInstanceState); 

tv = (TextView) view.findViewById(R.id.tv); 
tv.setText(((MainActivity)getActivity()).getFragment1Data()); 

}