2016-05-10 2 views
-1

В моем MainActivity Я вызываю фрагмент и устанавливаю логическое значение mFragment в true, когда он активен. Теперь я установил некоторый текст в объявлении TextViews во Фрагменте, и он отлично работает. Но когда Button, объявленный во Фрагменте, вызывает метод в MainActivity, suddently mFragment является ложным, и я не могу использовать getText из TextViews, потому что они равны нулю. Я понятия не имею, почему это так.GetText from Fragment возвращает 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

да чувак ты там нет никакой связи между '' Activity' и Fragment'. вы должны использовать [OTTO] (http://square.github.io/otto/) –

ответ

0

В вашей архитектуре много недостатков. Вы создаете экземпляр фрагмента и затем вызываете на нем методы. Вы не можете сделать это в android для таких компонентов, как действия, фрагменты, службы и т. Д. (Это можно сделать только для классов Java). Вы не можете просто создать объект фрагмента, подобный этому. Все фрагменты, действия и службы в Android должны проходить через их соответствующие жизненные циклы, чтобы у них был действительный контекст, связанный с ними.

Также взаимодействие взаимодействия фрагментов должно осуществляться через интерфейсы. Не путем простого вызова методов на их объектах, которые не должны создаваться в первую очередь. Вы можете заставить его работать, но в конечном итоге он будет вызывать проблемы. Недавно я ответил на два вопроса: this и this, у которых была такая же проблема. Похоже, у многих людей есть это сомнение.

0

Ваше сообщение и несколько баллов неверны.

Использование нижеупоста. Возможно, вы хотели получить доступ к current Метод или поля MainAcitivity. Но это не текущий экземпляр MainAcitivity. Вы просто создали экземпляр нового (также без жизненного цикла деятельности)

MainActivity mainActivity = new MainActivity(); 

Так вот почему mFragment boolen переменная ложна, а также другие элементы равны нулю, как TextViews.

Вы можете ссылаться ниже ссылки

Смежные вопросы