GetText from Fragment返回null,但setText有效



在我的MainActivity中,我调用一个Fragment,并在其活动时将布尔值mFragment设置为true。现在,我在Fragment中声明的TextViews中设置了一些Text,它工作得很好。但是,当Fragment中声明的Button突然调用MainActivity中的Method时,mFragment为false,并且我不能使用TextViews中的getText,因为它们为null。我不知道为什么会这样。

主要活动

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

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

您的体系结构有很多缺陷。你创建了一个片段实例,然后在上面调用方法。你不能在android中为活动、片段、服务等组件这样做(你只能为Java类这样做)。你不能像这样简单地创建一个片段对象。Android中的所有碎片、活动和服务都必须经历各自的生命周期,以便有一个有效的上下文。

此外,片段活动交互应该通过接口来完成。而不是简单地对它们的对象调用方法,而这些方法一开始就不能创建。你可能会让它发挥作用,但最终它会给你带来问题。我最近回答了两个问题,这个和这个有同样的问题。似乎很多人都有这种怀疑。

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

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

MainActivity mainActivity = new MainActivity();

这就是为什么mFragment boolen变量为false,而其他项也为null,比如textview。

你可以参考以下链接

  • http://developer.android.com/intl/es/training/basics/fragments/communicating.html
  • http://www.truiton.com/2015/12/android-activity-fragment-communication/

最新更新