gettext from fragment返回null,但settext有效

kjthegm6  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(265)

在我的 MainActivity 我调用一个片段并设置布尔值 mFragment 当其激活时为真。现在我在 TextViews 在片段中声明,工作正常。但是当一个 Button 在片段中声明调用 MainActivity 突然 mFragment 是假的,我不能用 getTextTextViews 因为它们是空的。我不知道为什么会这样。
主要活动

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

oyt4ldly1#

你的架构有很多缺陷。创建一个片段示例,然后对其调用方法。在android中,不能对活动、片段、服务等组件执行此操作(只能对java类执行此操作)。不能简单地创建这样的片段对象。android中的所有片段、活动和服务都必须经历各自的生命周期,以便它们具有一个有效的上下文。
此外,片段活动交互应该通过接口完成。而不是简单地调用它们的对象上的方法,这些对象一开始就不能被创建。你可能会得到它的工作,但最终它会继续给你带来麻烦。我最近回答了两个问题这个和这个有同样的问题。似乎很多人都有这种怀疑。

nsc4cvqm

nsc4cvqm2#

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

k4aesqcs

k4aesqcs3#

你的沟通和几点是错误的。
使用下面的用法,您可能希望访问当前MainActivity的方法或字段。但这不是当前的mainacivity示例。您刚刚示例化了一个新的示例(也没有活动的生命周期)

MainActivity mainActivity = new MainActivity();

这就是为什么mffragment 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/

相关问题