我有一个片段是一个“计时器”,我可以在任何地方添加。在片段中,我以编程方式更改textView,并且它运行得很漂亮。我的问题在于使用构造函数膨胀的视图中的视图(?不确定这是否是正确的术语)在它下面的另一个方法中。
public class Timer_fragment extends android.support.v4.app.Fragment {
int testpins;
String testedpin;
TextView text;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.timer_frag, container, false);
TextView text = (TextView) v.findViewById(R.id.pwd_status);
text.setText("Setting text in fragment not main");
/* set the TextView's text, click listeners, etc. */
updateStatus();
return v;
}
所有代码都没有错误,但是当我尝试添加此方法时:
private void updateStatus() {
TextView text = (TextView) findViewById(R.id.pwd_status);
testPin();
text.setText(testedpin);
}
我在findViewById下面有一条红线,上面写着The method findViewById(int) is undefined for the type Timer_fragment
。
我想过在我的所有方法中夸大视图并且不返回它们,但是肯定会以某种方式影响性能吗?
在尝试使用视图之前尝试对布局进行充气,但我在单词inflater
和container
上收到错误消息,说明无法解析。
我是否正确地解决了这个问题?
答案 0 :(得分:4)
您的片段范围内已有一个名为text
的成员变量。不要在你的方法中重新声明它,只需分配它。
text = (TextView) v.findViewById(R.id.pwd_status);
和
private void upateStatus() {
testPin();
text.setText(testedpin);
}
答案 1 :(得分:1)
方法'findViewById'由活动提供。虽然此类扩展了Fragment,但除非您向片段提供活动,否则您将无法访问与活动相关的方法调用。退房:http://developer.android.com/reference/android/app/Activity.html#findViewById(int)
基本上,要么将活动的实例传递给Timer_fragment:
private final Activity _activity;
Timer_fragment(Activity activity)
{
_activity = activity;
}
...
private void updateStatus()
{
TextView text = (TextView) _activity.findViewById(R.id.pwd_status);
testPin();
text.setText(testedpin);
}
或者从正在使用的任何活动中设置视图的文本,而不是从计时器类中设置。
答案 2 :(得分:0)
只需将findViewById
替换为getActivity().findViewById
。
findViewById方法在Activity类中定义。碎片不是活动。但是片段可以使用方法getActivity获取对将其添加到屏幕的Activity的引用。