从另一个类访问 TextView
Posted
技术标签:
【中文标题】从另一个类访问 TextView【英文标题】:Accessing TextView from another class 【发布时间】:2011-01-05 19:49:49 【问题描述】:我的主启动类正在加载 main.xml,但我试图弄清楚如何从另一个正在从数据库加载信息的类访问 TextView。我想将该信息发布到 TextView。
到目前为止,我还没有在 Google 上找到任何有用的示例。
编辑: 这是我的班级正在做数据库工作:
import android.widget.TextView;import android.view.View;
public class DBWork
private View view;
...
TextView tv = (TextView) view.findViewById(R.id.TextView01);
tv.setText("TEXT ME")
然而,每次我这样做我都会得到一个空指针异常
【问题讨论】:
你的主类如何调用 DBWork 类? 这是在 onCreate 里面:new DBWork("192.168.2.14:8080/DH/DPost", "test_db"); 【参考方案1】:你应该使用 LayoutInflater :
LayoutInflater inflater = getLayoutInflater();
View myView = inflater.inflate(R.layout.main, null);
TextView myTextView = (TextView) findViewById(R.id.myTextViewInXml);
【讨论】:
我是myView.findViewById(..)
【参考方案2】:
如果我是你,我会将你所有的 UI 更新保存在你的主要 Activity
类中。您只需让您的DBWork
类将您想要显示的文本返回给您的Activity
。所以像:
public class Main extends Activity
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) view.findViewById(R.id.TextView01);
DBWork db = new DBWork("192.168.2.14:8080/DH/DPost";, "test_db");
tv.setText(db.getText());
然后你的数据库类:
public class DBWork
...
public String getText()
//do stuff
return "";
请注意,您在onCreate
期间执行的任何数据库操作都应尽可能快,因为它们在 UI 线程中运行。如果您要执行长时间运行的数据库查询,那么您应该使用 AsyncTask
或创建一个新的 Thread
并使用 Handler
来更新 UI。
【讨论】:
【参考方案3】:您可以在创建类实例后将引用传递给所有控件。我个人将具有所有控件的整个类作为公共变量传递。
【讨论】:
【参考方案4】:你必须使用 xml 定义你的 TextView 并给它一个 id。示例:
<TextView android:layout_
android:layout_
android:textColor="#FFF"
android:gravity="center_vertical|right"
android:paddingLeft="5dip"
android:paddingRight="5dip"
android:text="@string/name"
android:id="@+id/myTextViewInXml"/>
然后你可以在每个类中使用它来访问它
TextView myTextView = (TextView) findViewById(R.id.myTextViewInXml);
【讨论】:
我认为findViewById(int)
只会从您已经使用setContentView(int)
加载的资源中检索UI 元素。【参考方案5】:
没错:
LayoutInflater inflater = getLayoutInflater();
View myView = inflater.inflate(R.layout.main, null);
TextView myTextView = (TextView) findViewById(R.id.myTextViewInXml);
但在您必须指定要使用的文件之前:
setContentView(包含 R.id.myTextViewInXml 的 XML 文件的 ID)
没有findViewById(R.id.myTextViewInXml);
总是会返回null
。
这是一个例子:
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.virtualtour); // before !!
progress_bar = (ProgressBar) findViewById(R.id.vt_progress);
loading_ly = (RelativeLayout) findViewById(R.id.vt_layout_loading);
panorama_description = (TextView) findViewById(R.id.vt_description);
virtualtour_relatively = (RelativeLayout) findViewById(R.id.vt_layout_opengl);
.........
【讨论】:
我尝试在我的班级中创建 onCreate 并将我的班级变成一个活动,但是当我执行 label = (TextView) findViewById(R.id.TextView01);仍然发现标签为空。 活动类必须是扩展类。例如 public class miaSuocera extends Activity......。【参考方案6】:TextView bt1 =m_activity.findViewById(R.id.textview1);
在上面的示例中,视图 bt1 来自另一个类。您可以通过使用类实例访问 bt1 并获取 id。现在,对 bt1 实例做任何您想做的事情。
注意:确保 bt1 在另一个类中是公开的
【讨论】:
以上是关于从另一个类访问 TextView的主要内容,如果未能解决你的问题,请参考以下文章