在我的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;
}
}
答案 0 :(得分:1)
使用回调接口从片段到活动进行交互。请参考。这是一种非常推荐的方法。 http://developer.android.com/training/basics/fragments/communicating.html#Implement
答案 1 :(得分:0)
您的架构存在许多缺陷。您创建一个片段实例,然后在其上调用方法。您无法在android中为活动,片段,服务等组件执行此操作(您只能对Java类执行此操作)。你不能简单地创建像这样的片段对象。 Android中的所有片段,活动和服务必须经历各自的生命周期,以便它们附加有效的上下文。
片段活动交互也应该通过接口完成。不是简单地调用其对象上的方法,而这些方法一开始就不能创建。你可能会让它工作,但最终会导致你的问题。我最近回答了两个问题this和this,它们存在同样的问题。好像很多人都有这个疑问。
答案 2 :(得分:0)
您的沟通和一些观点是错误的。
如果使用以下情况,您可能希望访问当前 MainAcitivity的方法或字段。但这不是MainAcitivity的当前实例。您刚刚实例化了一个新的(也没有活动的生命周期)
MainActivity mainActivity = new MainActivity();
这就是为什么mFragment boolen变量为false而其他项目为null,如textviews。
您可以参考以下链接