Как передавать данные между представлениями?

Я только начинаю писать приложения для Android. Я сделал несколько уроков для начинающих, но у меня возникли проблемы со следующим шагом, на который я не смог найти никакого полезного ответа.

Я хочу написать приложение, которое вычисляет значение сложной функции, которая зависит от трех параметров. Это работает, если я помещаю все в одно представление: для каждого параметра одно TextField (с именем параметра) плюс одно поле EditText для ввода значения. Внизу есть одна кнопка, и при нажатии на нее результат отображается в другом текстовом поле.

Но теперь я хочу улучшить макет (плюс я хочу научиться работать с более сложными структурами): два параметра обычно просто устанавливаются один раз, а затем сохраняются в своих значениях. Поэтому я решил переместить эти два параметра в другое представление.

Нет, я ищу рекомендации (и, надеюсь, ссылки на пример кода): какую структуру я должен использовать? Кажется, что мне не нужно использовать разные действия, но одно действие с разными взглядами должно делать эту работу. ViewSwitcher звучит разумно, так как в этом случае мне нужны только два разных представления. С другой стороны, ViewFlipper может быть предпочтительнее, так как я могу использовать его позже для других проектов с несколькими представлениями. Я также читал, что ViewPager позволяет проводить между различными видами.

Как я могу прочитать EditField, если это в другом представлении? Я попытался использовать ViewSwitcher, и он сработал, когда я добавил дополнительную кнопку для переключения на второй вид. Но когда я переместил TextField и EditField для параметров один и два во второе представление, приложение не запускалось на эмуляторе, а просто указывало "ошибка в приложении" (в то время как Eclipse не показывает ошибок). Исходя из этого, я предполагаю, что мне нужно проделать дополнительную работу для передачи данных в EditText между различными представлениями. Я не нашел никаких примеров для этого - кто-нибудь может дать мне несколько советов / примеров?

Любая помощь приветствуется


Я подумал, что мое первоначальное описание может быть не слишком полезным без какого-либо кода. Вот мой макет

<?xml version="1.0" encoding="utf-8"?>
<ViewSwitcher  xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/viewSwitcher1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

   <LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >

    <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical" >
    <TextView android:id="@+id/pg1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1st view" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    <TextView android:id="@+id/v1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="value1" />
    <EditText android:id="@+id/val1" 
        android:text="2.0"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:inputType="numberDecimal" />
    </LinearLayout>

        <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    <TextView android:id="@+id/v2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="value2" />
    <EditText android:id="@+id/val2" 
        android:text="3.0"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:inputType="numberDecimal" />
    </LinearLayout>

    <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal" >
    <Button android:layout_width="wrap_content" 
    android:id="@+id/calc"  
    android:layout_height="wrap_content" 
    android:text="2*Val1 + Val2 =" />
    <TextView android:id="@+id/res" 
        android:text="" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textStyle="bold" 
        android:textSize="24sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    <Button android:id="@+id/b1"
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content" 
        android:text="switch view 1" />    
    </LinearLayout>
  </LinearLayout>

<!--   next view     -->  

   <LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >

    <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical" >
    <TextView android:id="@+id/pg2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="View 2" />
    </LinearLayout>

   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="horizontal" >
    <Button android:id="@+id/b2"  
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="switch view 2" />    
    </LinearLayout>  
   </LinearLayout>

</ViewSwitcher>

и вот моя основная деятельность:

package com.example.testas2;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ViewSwitcher;

public class MainActivity extends Activity {

    ViewSwitcher switcher;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        switcher = (ViewSwitcher)findViewById(R.id.viewSwitcher1);
        initControls(); 
    }

      private void initControls()
      {  
          Button calculate=(Button)findViewById(R.id.calc);
          calculate.setOnClickListener(new Button.OnClickListener()
          {public void onClick (View  v) { calculate(); }});

          Button b1=(Button)findViewById(R.id.b1);
          b1.setOnClickListener(new Button.OnClickListener()
          {public void onClick (View  v) { switcher.showNext(); }});

          Button b2=(Button)findViewById(R.id.b2);
          b2.setOnClickListener(new Button.OnClickListener()
          {public void onClick (View  v) { switcher.showPrevious(); }});

          calculate();
      }

      private void calculate()
      {
          EditText val1=(EditText)findViewById(R.id.val1);
          EditText val2=(EditText)findViewById(R.id.val2);
          TextView res=(TextView)findViewById(R.id.res);
          Double Val1=Double.parseDouble(val1.getText().toString());
          Double Val2=Double.parseDouble(val2.getText().toString());
          Double result = 2*Val1+Val2;
          res.setText( String.format( "%.3f", result ) );
      }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

Эта версия работает: - при нажатии на первую кнопку она вычисляет: результат = 2 * значение1 + значение2) - при нажатии кнопки "переключить вид 1", она переходит во второй вид - на второй вид, при нажатии на кнопку "Переключить вид 2", он возвращается к виду 1

Но я не могу заставить работать следующие две части: 1) Я хотел бы переместить кнопку "Переключить представление 1" в верхнюю часть первого представления, но это приводит к ошибке в эмуляторе ("К сожалению, testas2 остановился")). 2) Я хотел бы переместить ввод второго значения во второй вид, но это дает ту же ошибку в эмуляторе.

Что я делаю неправильно? Почему порядок элементов в макете имеет значение, и как я могу изменить свой код, чтобы он работал?

3 ответа

Решение

Я только что сделал "Project > Clean", перезапустил приложение в эмуляторе, и теперь оно работает!
Другими словами, решение исходного вопроса тривиально (на самом деле реальной проблемы не было). Можно просто перемещать элементы в файле макета (TextView, EditText, Button) внутри представления или между представлениями. Размещенное действие работает всегда, и данные (из разных полей TextView и EditView) доступны везде в коде. Следовательно, никакой явной "передачи" данных между представлениями не требуется.
Только после перемещения элементов в файле макета следует выполнить "Проект> Очистить".

Пример кода -

TextView tField= (add cast here)findViewById(R.id.editText)

tfield.getText();

Приведенный выше ответ может быть улучшен, если вы разместите какой-то свой код, потому что время от времени findViewById зависит от представления контейнера, и приведенный выше код не будет работать тогда, когда он будет искать текстовое поле в представлении по умолчанию.

В вашей текущей деятельности создайте новое намерение:

Intent i = new Intent(getApplicationContext(), NewActivity.class);
i.putExtra("new_variable_name","value");
startActivity(i);

Затем в новом действии извлеките эти значения:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("new_variable_name");
}

Для получения дополнительной информации перейдите по этой ссылке

Другие вопросы по тегам