我知道有很多帖子都有相似的标题,但我现在一直在搜索和试验几个小时,而且我没有找到任何可以帮助我的东西,所以我在寻求帮助之前,我的头脑会沮丧地爆炸。
我有一个从xml文件中膨胀的对话框片段,但我需要从NFC标签动态更新TextView文本值。我不能,为了我的生活,找到如何获取TextView对象,以便我可以更新它。在onCreate方法中,它很容易,但在其他任何地方我都尝试它,我得到一个空指针异常,因为显然该ID在该布局中不存在。
以下是适用的片段代码:
View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.foo_bar, container,
false);
//Eliminate the title frame
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return rootView;
在oncreate方法中,我可以轻松自由地使用findViewById来操作我的值。但是,即使rootView是一个类范围的变量,在类的其他方法中,我也无法使用完全相同的方法(??)来完成此任务。
我尝试了很多其他方法,都无济于事。我需要完成的只是在Activity类或片段类中,在创建之后更新TextView文本。
这是我的主要活动类,即创建此片段的方法:
public void showLogDialog( String title ){
LogWorkOut updateDialog = new LogWorkOut();
updateDialog.show(fm, "Update2Metrics");
updateDialog.setHeader(title);
}
我希望能够使用setter,如此处所示(setHeader)来设置它。或者,如果我实际上可以获取到包含被夸大的id的视图,我可以直接进行。根据所有权限,updateDialog本身应该是该视图,因为返回了rootView。这毫无意义。
你能感觉到我对Java的仇恨吗?
任何提示或帮助都可以节省生命。我可能会送你鲜花。如果你喜欢鲜花。
编辑:因为它现在被问了两次,这就是我试图更新我的TextView的方式(但我并不在乎,只要它在onCreateView中不,因为我需要在创建它之后再做。)TextView headerView = (TextView) rootView.findViewById(R.id.header_view);
我在绝望中尝试了各种不同的形式,包括在片段和主要活动中尝试各种形式的getView。什么都行不通,因为使用rootView只能在onCreate方法中起作用是没有意义的。
Edit2:由于有两个人提供了这个解决方案,因此将TextView设置为类对象不起作用。如果我尝试在onCreateView之外使用setText(),我仍然会得到NullPointerException。以下示例。
public class LogWorkOut extends DialogFragment {
//Class variables and objects
FragmentManager fm = getFragmentManager();
TextView headerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.log_workout_2, container,
false);
//Eliminate the title frame
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
headerView = (TextView) rootView.findViewById(R.id.workout_title);
headerView.setText("Test");
return rootView;
}
上面,在onCreateView方法中,使用setText工作得很好。如果我然后尝试在另一个方法中更新它,如下所示,我得到一个空指针异常:
public void setHeader( String header) {
headerView.setText(header);
}
答案 0 :(得分:0)
在onCreateView中获取对textview的引用:
TextView mTextView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.foo_bar, container,
false);
//Eliminate the title frame
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
mTextView = (TextView) rootView.findViewById(R.id.header_view);
return rootView;
}
然后您可以在onCreateView
之后的任何名为的方法中使用它private void setTextViewContent(String text)
{
mTextView.setText(text);
}
编辑:
如果您的片段未附加到任何活动,则您的视图将为null。如果在片段未附加到活动时有可能运行代码,则应在尝试操作任何视图之前调用isAdded()
。