将新文本设置为文本视图时出现空指针异常

时间:2014-06-23 19:11:14

标签: android

我正在尝试在手机上运行AndroidApp。我能够显示我的欢迎片段,而且我可以触发日志消息。不幸的是,如果我想将文本值从'welcome'更改为'Neuer Text',我会得到一个空指针异常。什么地方出了错?我对android开发很新。

public class WelcomeFragment extends Fragment implements OnClickListener {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_welcome, container, false);
        Button button1 = (Button) view.findViewById(R.id.button1);
        button1.setOnClickListener((OnClickListener) this);
        return view;
    }
    @Override
    public void onClick(View v) {
        //Log.d("JobaApp", "Logtext"); // see LogCat
        TextView text1 = (TextView) v.findViewById(R.id.welcome_text);
        text1.setText("NeuerText");
    }
}

3 个答案:

答案 0 :(得分:2)

onClick()中,v是点击的视图项,例如按钮,而不是onCreateView()中充气的视图。

您应该使用getView()

public class WelcomeFragment extends Fragment implements OnClickListener {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_welcome, container, false);
        Button button1 = (Button) view.findViewById(R.id.button1);
        button1.setOnClickListener((OnClickListener) this);
        return view;
    }
    @Override
    public void onClick(View v) {
        //Log.d("JobaApp", "Logtext"); // see LogCat
        switch (v.getId) {
        case R.id.button1:
            TextView text1 = (TextView) getView().findViewById(R.id.welcome_text);
            text1.setText("NeuerText");
            break;
        }
    }
}

此外,如果您不希望针对每个按钮执行此操作,您可能需要考虑使用switch中的onClick()声明。

答案 1 :(得分:1)

你无法从按钮的onClick传递参数(" View v")中获取TextView,因为这是实际按钮的视图。

您应该执行以下操作:

public class WelcomeFragment extends Fragment implements OnClickListener {
View view;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_welcome, container, false);
        Button button1 = (Button) view.findViewById(R.id.button1);
        button1.setOnClickListener((OnClickListener) this);
        return view;
    }
    @Override
    public void onClick(View v) {
        //Log.d("JobaApp", "Logtext"); // see LogCat
        TextView text1 = (TextView) view.findViewById(R.id.welcome_text);
        text1.setText("NewerText"); //Also fixed typo
    }
}

答案 2 :(得分:0)

OnClick(View v)中,v是您点击的按钮。 TextView不属于Button,属于R.layout.fragment_welcome。因此,您可以在片段的onCreateView()内找到并初始化TextView,然后在onClick()中使用它; 有些像这样:

public class WelcomeFragment extends Fragment implements OnClickListener {
TextView tv;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_welcome, container, false);
        Button button1 = (Button) view.findViewById(R.id.button1);
        button1.setOnClickListener((OnClickListener) this);
        tv = (TextView) v.findViewById(R.id.welcome_text);
        return view;
    }
    @Override
    public void onClick(View v) {
        //Log.d("JobaApp", "Logtext"); // see LogCat

        tv.setText("NeuerText");
    }
}