2017-06-22 74 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()); 

}