当其他片段更改第一个片段模型时刷新片段

时间:2016-03-22 19:20:54

标签: java android android-fragments

我希望在视图寻呼机更改时刷新片段。

package com.mcivisoft.rcbeam;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;

import com.mcivisoft.rcbeam.R;

public class FragBeamRec extends Fragment {    
    public static FragBeamRec newInstance() {
        FragBeamRec fragment = new FragBeamRec();
        return fragment;
    }

    public FragBeamRec() {}

    private EditText tasss = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View v = inflater.inflate(R.layout.fragment_frag_beam_rec, container, false);

        tasss = (EditText)v.findViewById(R.id.txttttaasss);
        tasss.setText(String.valueOf(var.asspass));

        ActivityBeamRec.mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                if (position == 2) {
                    Fragment frg = null;
                    frg = getFragmentManager().findFragmentByTag("FragBeamRec");
                    final FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.detach(frg);
                    ft.attach(frg);
                    ft.commit();
                }
            }

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

            @Override
            public void onPageScrollStateChanged(int state) {}
        });

        return v;
    }
}

这不起作用,任何人都可以告诉我原因。我一直试图刷新这个碎片三天了,请帮忙。

我希望它刷新的原因是我在同一个活动中获得了其他片段(选项卡式活动),在第一个片段中有一个按钮可以进行一些计算并将结果放在一个全局变量中,这个片段显示了公共变量的值,并且因为它是在单击按钮之前创建的,所以它显示0.0这就是我希望它刷新的原因,以便显示全局变量的当前值。

3 个答案:

答案 0 :(得分:1)

您应该只刷新视图,而不是刷新片段。有关教程,请参阅片段(http://developer.android.com/training/basics/fragments/communicating.html)之间的通信指南。这里适用相同的概念。

基本上,您需要通知FragBeamRec片段,按钮OnClickListener内的计算已完成

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int result = 4 + 4;
            fragBeamRec.onCalculationComplete(result);
        }
    });

带有界面

public interface OnCalcComplete {     
    void onCalculationComplete(int result);
}

然后在片段中有类似

的内容
public class FragBeamRec extends Fragment implements OnCalcComplete {
    public void onCalculationComplete(int result) {
        textView.setText(result);
    }
...
}

答案 1 :(得分:0)

我是通过private EditText tasss = null;替换public static EditText tasss = null;这样做的,我可以从任何地方访问它。点击监听器上的按钮FragBeamRec.tasss.setText(String.valueOf(var.asspass));

答案 2 :(得分:0)

我认为你的整个实现都不稳定

您在ViewPager内部有一个FragBeamRec,它位于ActivityBeamRec中。

通过这种方式,如果ViewPager中有4个片段,那么当所述数据模型发生更改时,甚至可能从未创建过FragBeamRec。

最好的实现是从ActivityBeamRec中刷新所有刷新。在活动内注册viewPagerChangeListener。您还可以绑定在模型更改时触发ActivityBeamRec活动的侦听器接口。

您现在可以使用

从活动中获取片段
private Fragment getFragmentFromPager(int index) {
    return getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.parentViewPager + ":" + index);
}

通过传入viewPager中的Fragment索引位置,您将获得一个Fragment对象,您可以使用该对象执行任何形式的刷新