Fragment中的GetText返回null但setText有效

时间:2016-05-10 14:58:31

标签: java android android-fragments

在我的MainActivity中,我调用片段并在其活动时将布尔值mFragment设置为true。现在我在片段中声明的TextViews中设置了一些文本,它运行正常。但是,如果片段中声明的Button调用MainActivity突然mFragment中的方法为假,我无法使用getText中的TextViews因为它们是空的。我不知道为什么会这样。

主要活动

public class MainActivity extends AppCompatActivity implements SensorEventListener {

MainFragment mainFragment;
HistoryActivity historyFragment;
boolean mFragment = false;

//....

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mainFragment = new MainFragment();
    historyFragment = new HistoryActivity();

 if(!mFragment) {
        getMainFragment();
    }

//...SenserManager and so on

 @Override
public void onSensorChanged(SensorEvent event){
    if (mFragment) {
        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];

        DecimalFormat df = new DecimalFormat("0.000");

        //This works constantly:
        mainFragment.textViewX.setText("X = " + df.format(x));
        mainFragment.textViewY.setText("Y = " + df.format(y));
        mainFragment.textViewZ.setText("Z = " + df.format(z));
    }
}

public void writeEntry(){ //called in Fragment
    if(mFragment) {
        //This doesn't work (isn't even called because mFragment is false)
        String x = (String) mainFragment.textViewX.getText();
        String y = (String) mainFragment.textViewY.getText();
        String z = (String) mainFragment.textViewZ.getText();
    }
}

public void getMainFragment() {
    FragmentTransaction transaction =   getFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, mainFragment);
    transaction.addToBackStack(null);
    transaction.commit();
    mFragment = true;
}

片段

public class MainFragment extends Fragment {

TextView textViewX;
TextView textViewY;
TextView textViewZ;
Button button;

MainActivity mainActivity = new MainActivity();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_main, container, false);

    textViewX = (TextView) view.findViewById(R.id.textViewX);
    textViewY = (TextView) view.findViewById(R.id.textViewY);
    textViewZ = (TextView) view.findViewById(R.id.textViewZ);
    button = (Button) view.findViewById(R.id.button);

    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            mainActivity.writeEntry();
        }});

    return view;
    }
}

3 个答案:

答案 0 :(得分:1)

使用回调接口从片段到活动进行交互。请参考。这是一种非常推荐的方法。 http://developer.android.com/training/basics/fragments/communicating.html#Implement

答案 1 :(得分:0)

您的架构存在许多缺陷。您创建一个片段实例,然后在其上调用方法。您无法在android中为活动,片段,服务等组件执行此操作(您只能对Java类执行此操作)。你不能简单地创建像这样的片段对象。 Android中的所有片段,活动和服务必须经历各自的生命周期,以便它们附加有效的上下文。

片段活动交互也应该通过接口完成。不是简单地调用其对象上的方法,而这些方法一开始就不能创建。你可能会让它工作,但最终会导致你的问题。我最近回答了两个问题thisthis,它们存在同样的问题。好像很多人都有这个疑问。

答案 2 :(得分:0)

您的沟通和一些观点是错误的。

如果使用以下情况,您可能希望访问当前 MainAcitivity的方法或字段。但这不是MainAcitivity的当前实例。您刚刚实例化了一个新的(也没有活动的生命周期)

MainActivity mainActivity = new MainActivity();

这就是为什么mFragment boolen变量为false而其他项目为null,如textviews。

您可以参考以下链接