2016-05-10 11 views
-1

私のMainActivity私はフラグメントを呼び出し、ブール値mFragmentをアクティブにするとtrueに設定します。今度は、フラグメントに宣言されたTextViewsにいくつかのテキストを設定しました。しかし、フラグメント内で宣言されたButtonMainActivity suckently mFragmentのメソッドを呼び出すと、nullであるのでのgetTextを使用できません。私はなぜこれがそうであるか分かりません。バック活動への断片から対話するフラグメントからのGetTextはnullを返しますが、setTextは機能します

主な活動

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

をリンクします。 [OTTO](http://square.github.io/otto/)を使用してください。 –

答えて

0

あなたのアーキテクチャには多くの欠陥があります。フラグメントインスタンスを作成し、そのインスタンスでメソッドを呼び出しています。あなたは、アクティビティ、フラグメント、サービスなどのコンポーネントのためにアンドロイドでこれを行うことはできません(これはJavaクラスに対してのみ行うことができます)。このような断片のオブジェクトを単純に作成することはできません。 Androidのすべてのフラグメント、アクティビティ、およびサービスは、有効なコンテキストが添付されるように、それぞれのライフサイクルを通過する必要があります。

また、フラグメントアクティビティの相互作用は、インターフェイスを介して行う必要があります。最初に作成してはならないオブジェクト上のメソッドを呼び出すだけではありません。あなたはそれを働かせるかもしれないが、最終的にそれはあなたの問題を引き起こし続けるでしょう。私は最近、同じ問題を抱えていた2つの質問thisthisに答えました。たくさんの人がこの疑いを持っているようです。

0

あなたのコミュニケーションといくつかの点は間違っています。

おそらく MainAcitivityの方法にアクセスしたいと考えています。しかし、これはMainAcitivityの現在のインスタンスではありません。あなただけの

MainActivity mainActivity = new MainActivity(); 

(も活動のライフサイクルなし)新しいものをインスタンス化しているので、この変数boolen mFragmentが偽であり、また、他の項目はtextviewsのように、ヌルである理由。

あなたは以下を参照できますが、 `Activity`と` Fragment`の間には関係がない男はい

関連する問題