2013-06-24 13 views
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 t1 = (TextView) findViewById(R.id.txt_cad_alis) 

读的TextView的价值,但“T1”被始终为空。我究竟做错了什么?

+0

显示您想要获取TextView的完整代码。该代码是否在Caclulator Activity中? – Plato

+0

第一段代码来自主要活动,第二段代码(TextView t1 .....)在计算活动 –

+0

您是否试图从一个活动访问数据到另一个活动? 你说的对话框,但从代码它显示,你正在开始新的活动 – Swapnil

回答

1

您正在尝试访问第二个活动的第一个活动 中的Textview t1,这就是为什么它总是为空的原因

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

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"); 
     } 
    } 
+0

非常感谢。所有的答案都很有帮助,但我必须选择一个答案。我已经提出了所有可观的答案。 –

0

两个可能的原因:

  1. 你是不是叫setContentView()onCreate(),或者你正在传递错误的布局ID来setContentView()
  2. txt_cad_alis不是textview的正确ID。
2

声明TextView作为成员变量(一个方法之外,大概类声明之后。然后初始化TextViewonCreate()

public class MyActivity extends Activity 
{ 
    TextView t1; 

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

然后使用类似String text = ti.getText().toString()进去你Dialog文本

1

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

1

这里要记住的一件重要事情是封装 - 你绝对不应该直接从对话框中直接访问属于MainActivity的视图。这不仅违反了最佳实践和封装原则,而且如果您想要在不同的环境中重用对话,它也会导致您头痛不已。

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

你应该做的是获取onClick文本字段的值,然后将其传递给对话框。

1

您不能访问属于其他活动的View。你可以做的反而是开始你的活动之前阅读的价值,并通过使用意图额外其发送给你的第二个活动:

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"); 
} 
相关问题