Android DialogFragment动态更新视图setText

时间:2015-06-24 00:47:36

标签: android dialogfragment

我知道有很多帖子都有相似的标题,但我现在一直在搜索和试验几个小时,而且我没有找到任何可以帮助我的东西,所以我在寻求帮助之前,我的头脑会沮丧地爆炸。

我有一个从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);
}

1 个答案:

答案 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()