0

我正在尝试创建货币应用程序。我在主要活动上有一个按钮,当您单击该按钮时,它会打开一个类似于货币转换器的对话框。我的问题是我无法从主要活动打开的对话框中获取主要活动的文本视图的值。

这就是我从主要活动中打开对话框的方式

 Button calc = (Button) findViewById(R.id.btn_converter);
    calc.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            Intent myIntent = new Intent(MainActivity.this, Calculator.class);
            MainActivity.this.startActivity(myIntent);
        }
    });

这就是我试图从对话框中读取 textview 值的方式

Textview t1 = (TextView) findViewById(R.id.txt_cad_alis)

但“t1”始终为空。我究竟做错了什么?

4

6 回答 6

2

声明TextView为成员变量(在方法之外,可能在类声明之后。然后初始化TextViewinonCreate()

public class MyActivity extends Activity
{
    TextView t1;

    public void onCreate(...)
    {
        ...
        t1 = (TextView) findViewById(R.id.txt_cad_alis);
        ...
    }

然后使用类似的东西String text = ti.getText().toString()来获取你的文本Dialog

于 2013-06-24T14:05:55.273 回答
1

您正在尝试从第二个活动访问第一个活动上的 Textview t1。这就是为什么它总是空的。

单击按钮时,您应该从 TextView 中获取值并将其置于 hte 意图中。

Button calc = (Button) findViewById(R.id.btn_converter);
calc.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        Textview t1 = (TextView) findViewById(R.id.txt_cad_alis);
        String value = t1.getText().toString();
        Intent myIntent = new Intent(MainActivity.this, Calculator.class);
        intent.putExtra("aKey", value);
        MainActivity.this.startActivity(myIntent);
    }
});

然后在第二个活动的 onCreate() 方法中,您可以像这样检索值:

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    Intent i = getIntent();
        if (i.hasExtra("aKey")){
             String value = i.getStringExtra("aKey");   
        }
  }
于 2013-06-24T14:10:36.633 回答
1

为 t1 TextView 声明一个类属性,并在 MainActivity 的 onCreate() 中获取它的引用。然后,在启动 CalculatorActivity 之前,获取 t1 的值并将其传递给 Intent。在这种情况下,通过“myIntent”。希望能帮助到你。

于 2013-06-24T14:10:56.007 回答
1

这里要记住的一件重要事情是封装——你当然不应该从对话框中直接访问属于 MainActivity 的视图。这不仅违反了最佳实践和封装原则,而且如果你想在不同的上下文中重用你的对话框,它也会给你带来很大的麻烦。

这个想法是,如果提供正确的信息,任何单独的视图(如您的对话框)都应该在任何情况下都可用,并且不应依赖其父类中某些字段的存在。

您应该做的是在onClick中获取文本字段的值,然后将其与intent一起传递给对话框。

于 2013-06-24T14:12:31.687 回答
1

您无法访问View属于另一个活动的。相反,您可以做的是在开始活动之前读取该值,并使用 intent extras 将其发送到您的第二个活动:

Intent myIntent = new Intent(MainActivity.this, Calculator.class);
myIntent.putExtra("value", t1.getText().toString());
MainActivity.this.startActivity(myIntent);

在您的Calculator班级中,很容易获得价值:

protected void onCreate(Bundle savedInstanceState) {
    ...
    String textViewValue = getIntent().getStringExtra("value");
}
于 2013-06-24T14:13:11.250 回答
0

两个可能的原因:

  1. 您没有调用setContentView()您的onCreate(),或者您将错误的布局 id 传递给setContentView().
  2. txt_cad_alis不是 textview 的正确 id。
于 2013-06-24T14:05:28.743 回答