带有选项卡的片段UI没有被更新



我有两个包含两个不同片段的选项卡。Tab1用于fragment1tab2用于fragment2。从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);
}

重要更新:如果我更新处理程序中的UI 。然后它起作用。但是,似乎这不是正确的方法。

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

使用 .executependingTransactions((,它将与 .commit((同步工作。

片段输入后 fragmentTransaction.commit((,计划执行 在过程主线程上异步。如果你想 立即执行任何待处理的操作,您可以调用此事 功能(仅来自主线程(才能这样做。请注意所有回调 以及其他相关行为将在此呼叫中完成,因此 小心从哪里调用。

做:

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

嘿,嗨,我不确定,但请尝试以下操作:

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

在片段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());
}

最新更新