Как передавать данные между представлениями?
Я только начинаю писать приложения для 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");
}
Для получения дополнительной информации перейдите по этой ссылке