从另一个类访问 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的主要内容,如果未能解决你的问题,请参考以下文章

从另一个类访问 UI 图像

从另一个类 c++ 访问 UI 元素

UIImageView 范围。从另一个类访问

从另一个类访问 viewController 元素

从另一个类访问 MainWindow 类成员

从另一个类访问 UISegmentedControl @IBOoutlet