1

我刚刚开始编写 Android 应用程序。我已经完成了一些初学者的教程,但是我在下一步中遇到了麻烦,我找不到任何有用的答案。

我想编写一个应用程序来计算取决于三个参数的复杂函数的值。如果我将所有内容放在一个视图中,这将起作用:对于每个参数,一个 TextField(带有参数名称)加上一个 EditText 字段来输入值。在底部有一个 Button,当单击它时,结果会显示在另一个 TextField 中。

但现在我想改进布局(另外我想学习如何处理更复杂的结构):其中两个参数通常只设置一次,然后保持它们的值。所以我决定将这两个参数移到不同的视图。

不,我正在寻找建议(并希望链接示例代码):我应该使用哪种结构?似乎我不需要使用不同的活动,但是一个具有不同视图的活动应该可以完成这项工作。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 * value1 + value2) - 当按下按钮“切换视图 1”时,它进入第二个视图 - 在第二个视图上,按下按钮时“切换视图 2”,返回视图 1

但我无法让以下两部分工作:1)我想将“切换视图 1”按钮移动到第一个视图的顶部,但这会在模拟器中产生错误(“不幸的是 testas2 已停止” )。2)我想将第二个值的输入移动到第二个视图,但这会在模拟器中产生相同的错误。

我究竟做错了什么?为什么布局中元素的顺序很重要,如何修改代码以使其正常工作?

4

3 回答 3

1

示例代码 -

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

tfield.getText();

如果您发布您的一些代码,则可以改进上述答案,因为 findViewById 有时取决于容器视图,并且上述代码将不起作用,因为它将在默认视图中查找文本字段。

于 2013-05-06T21:33:49.777 回答
1

我刚刚做了“项目>清理”,在模拟器中重新启动了应用程序,现在它可以工作了!
换句话说,原始问题的解决方案是微不足道的(实际上并没有真正的问题)。可以简单地在视图内或视图之间移动布局文件(TextView、EditText、Button)中的元素。发布的活动始终有效,并且数据(来自不同的 TextView 和 EditView 字段)可在代码中的任何位置访问。因此,不需要在视图之间进行显式的数据“传输”。
只有在布局文件中移动元素后,才应该执行“Project > Clean”。

于 2013-05-07T16:33:23.157 回答
0

在您当前的 Activity 中,创建一个新的 Intent:

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

然后在新的 Activity 中,检索这些值:

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

有关更多信息,请点击此链接

于 2013-05-06T23:23:40.940 回答