带有选项卡的片段UI未更新

时间:2017-06-22 12:28:37

标签: android android-fragments

我有两个标签,其中包含两个不同的片段。 Tab1fragment1tab2fragment2。从fragment1开始,我想通过点击按钮在fragment2的TextView中传递字符串值。 但是,fragment2的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);
        }
    }
}

在Fragment1中:

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

重要更新: 如果我在处理程序中更新用户界面。然后它工作。但是,似乎不是正确的方式。

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

3 个答案:

答案 0 :(得分: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);
           }
    }

答案 1 :(得分: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);
        }

答案 2 :(得分:0)

在片段1中设置活动方法中的数据,并在加载片段时从活动中获取数据并将其设置在片段2中

 mainActivity(){
string fragment1Data;

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

public string getFragment1Data(){
return fragment1Data 
}
}
片段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");
       ((MainActivity)getActivity()).setFragment1Data("data");
    }
});
}
片段2中的

 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());

}