在警报Dialog类的showAlret(String message, Context ctx)
方法中,我试图在对话框的布局XML中获取对TextView的引用:
TextView tv = (TextView)((MyActivity)ctx).findViewById(R.id.tv_about);
当然不是在调用inflate()之前:
LayoutInflater li = LayoutInflater.from(ctx);
View view = li.inflate(R.layout.aboutdialog, null);
问题是此调用会将tv
返回为 null 。
由于代码编译没有任何警告,我假设这是由于“非法”将Context转换为MyActivity。
我遇到过很多案例,其中将Context to Activity转化为唯一真正有用的东西,为什么在这种情况下这不起作用?
什么时候将Context转换为Activity才有意义?
这方面的“潜规则”是什么?
答案 0 :(得分:3)
LayoutInflater li = LayoutInflater.from(ctx);
View view = li.inflate(R.layout.aboutdialog, null);
TextView tv = view.findViewById(R.id.tv_about);
我知道你的textview是对话框xml的一部分,所以你需要在对话框视图而不是活动上找到ViewById()。
答案 1 :(得分:1)
不,不,否则你会有异常。 你确定你的Activity在你尝试获取时从xml加载了TextView吗?
答案 2 :(得分:1)
我找到了解决方案。我的错误是我在做:
TextView tv = (TextView)((MyActivity)ctx).findViewById(R.id.tv_about);
而不是:
TextView tv = (TextView)view.findViewById(R.id.tv_about);
答案 3 :(得分:0)
一方面,您可以在活动时将上下文转换为活动。 Context是Activity的基类。
当您的方法在Context对象上不可用时,您只需要转换为Activity。转换只是告诉编译器你确定它是一个Activity的一种方式,因为编译器将会知道你在做什么。