根据TextView内的文本更改TextView的颜色

3
我是一名有用的助手,可以为您翻译文本。
我正在构建一个将XML解析成ListView的应用程序。 ListView显示“问题”及其严重级别。
在XML文件中,“severityID”可以是1、2或3,但是使用“replace()”方法,我已经在我的代码中将其更改为High、Medium和Low(可能不相关)。
当TextView显示“High”时,我想将setTextColor设置为红色,而当“Medium”则为黄色等。
我以为这很容易,只需要使用if语句就可以了:
if (severity.getText().toString.equalsIgnoreCase("High")) {

    severity.setTextColor(Color.RED);

}

然而,我的应用程序崩溃了。

我还尝试过:

if (value.equals("High")) {


 severity.setTextColor(Color.RED);

}    

我猜我可能错过了一些显而易见的东西,但我只有开发了3个月,所以如果我错了,请原谅。

提前感谢。

日志记录:

09-10 14:15:37.720: E/AndroidRuntime(6642): FATAL EXCEPTION: main
09-10 14:15:37.720: E/AndroidRuntime(6642): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.issueslist/com.example.issueslist.MainActivity}: java.lang.NullPointerException
09-10 14:15:37.720: E/AndroidRuntime(6642):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at android.app.ActivityThread.access$600(ActivityThread.java:153)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at android.os.Looper.loop(Looper.java:137)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at android.app.ActivityThread.main(ActivityThread.java:5289)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at java.lang.reflect.Method.invokeNative(Native Method)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at java.lang.reflect.Method.invoke(Method.java:525)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at dalvik.system.NativeStart.main(Native Method)
09-10 14:15:37.720: E/AndroidRuntime(6642): Caused by: java.lang.NullPointerException
09-10 14:15:37.720: E/AndroidRuntime(6642):     at com.example.issueslist.MainActivity.onCreate(MainActivity.java:100)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at android.app.Activity.performCreate(Activity.java:5133)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
09-10 14:15:37.720: E/AndroidRuntime(6642):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293)
09-10 14:15:37.720: E/AndroidRuntime(6642):     ... 11 more

以下是我的一些代码:

package com.example.issueslist;

import java.util.ArrayList;
import java.util.HashMap;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.app.ListActivity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;

import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class MainActivity extends ListActivity {

TextView severity;

    static final String URL = "URL.xml";
static final String KEY_HELPDESKCALLS = "HELPDESKCALLS";
static final String KEY_DATE = "dateCreated";
static final String KEY_TITLE = "callTitle";
static final String KEY_DESC = "callDescription";
static final String KEY_SEVE = "severityid";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    severity = (TextView) findViewById(R.id.seve);

    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(URL);
    Document doc = parser.getDomElement(xml);

    NodeList nl = doc.getElementsByTagName(KEY_HELPDESKCALLS);

    for (int i = 0; i < nl.getLength(); i++) {

        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);

        map.put(KEY_DATE, parser.getValue(e, KEY_DATE).substring(0, 10));
        map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
        map.put(KEY_DESC, parser.getValue(e, KEY_DESC));
        map.put(KEY_SEVE, parser.getValue(e, KEY_SEVE).replace("1", "High")
                .replace("2", "Medium").replace("3", "Low"));

        menuItems.add(map);

        ListAdapter adapter = new SimpleAdapter(this, menuItems,
                R.layout.list_item, new String[] { KEY_TITLE, KEY_DESC,
                        KEY_DATE, KEY_SEVE }, new int[] { R.id.name,
                        R.id.desciption, R.id.cost, R.id.seve });

        setListAdapter(adapter);

        ListView list = getListView();

        list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                String title = ((TextView) view.findViewById(R.id.name))
                        .getText().toString();
                String date = ((TextView) view.findViewById(R.id.cost))
                        .getText().toString();
                String description = ((TextView) view
                        .findViewById(R.id.desciption)).getText()
                        .toString();
                String priority = ((TextView) view.findViewById(R.id.seve))
                        .getText().toString();

                Intent in = new Intent(getApplicationContext(),
                        MenuItemActivity.class);
                in.putExtra(KEY_TITLE, title);
                in.putExtra(KEY_DATE, date);
                in.putExtra(KEY_DESC, description);
                in.putExtra(KEY_SEVE, priority);
                startActivity(in);

            }
        });

    }

    String value = severity.getText().toString();

    if (value.equals("High")) {

        severity.setTextColor(Color.RED);

    } else if (value.equals("Medium")) {

        severity.setTextColor(Color.YELLOW);

    }
}

}


1
请发布堆栈跟踪。另外,上面的代码中有一些拼写错误。那是无法编译的。请在此处复制粘贴您的代码。 - Nitin Sethi
请在此处分享您的一些代码。 - Ritaban
我已经发布了我的代码。谢谢。 - acb91
我可能在代码中漏掉了,但是严重性文本实际上是在哪里设置的? - Roy James Schumacher
map.put(KEY_SEVE, parser.getValue(e, KEY_SEVE).replace("1", "高") .replace("2", "中").replace("3", "低")); menuItems.add(map); ListAdapter adapter = new SimpleAdapter(this, menuItems, R.layout.list_item, new String[] { KEY_TITLE, KEY_DESC, KEY_DATE, KEY_SEVE }, new int[] { R.id.name, R.id.desciption, R.id.cost, R.id.seve }); setListAdapter(adapter); - acb91
4个回答

0

问题出在这一行:

String value = severity.getText().toString(); available above onCreate() method

您正在尝试访问一个空的severity对象。

请将此行从那里删除,并在PriorityColour()函数开头添加此行。


谢谢您的回复,但它仍然强制关闭?我也尝试了这种方式:if (severity.getText().toString.equalsIgnoreCase("High")) {severity.setTextColor(Color.RED);}但它仍然强制关闭。 - acb91

0
String value = severity.getText().toString();

severity = (TextView) findViewById(R.id.seve);之后执行此操作。

您正在尝试在onCreate之前读取textview中的值,在setContentView之后,所有视图都会被填充。


谢谢,我已经按照你说的做了,但它仍然强制关闭。 - acb91
从看到logcat,我会说空指针是由于你的MainActivity中这一行代码引起的。String value = severity.getText().toString(); 删除该行并将其放在oncreate中,在找到具有id的textview后再执行。 - khubaib
我已经修改了我的代码,按照我认为你所说的方式,并更改了logcat。 - acb91

0
尝试这个。你在onclick监听器关闭之前关闭了for循环。
package com.example.issueslist;

import java.util.ArrayList; import java.util.HashMap;

import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList;

import android.app.ListActivity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle;

导入java.util.ArrayList; 导入java.util.HashMap;

导入org.w3c.dom.Document; 导入org.w3c.dom.Element; 导入org.w3c.dom.NodeList;

导入android.app.ListActivity; 导入android.content.Intent; 导入android.graphics.Color; 导入android.os.Bundle;

import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class MainActivity extends ListActivity {

TextView severity;

static final String URL = "URL.xml";
static final String KEY_HELPDESKCALLS = "HELPDESKCALLS";
static final String KEY_DATE = "dateCreated";
static final String KEY_TITLE = "callTitle";
static final String KEY_DESC = "callDescription";
static final String KEY_SEVE = "severityid";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

severity = (TextView) findViewById(R.id.seve);

ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>> ();

XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL);
Document doc = parser.getDomElement(xml);

NodeList nl = doc.getElementsByTagName(KEY_HELPDESKCALLS);

for (int i = 0; i < nl.getLength(); i++) {

    HashMap<String, String> map = new HashMap<String, String>();
    Element e = (Element) nl.item(i);

    map.put(KEY_DATE, parser.getValue(e, KEY_DATE).substring(0, 10));
    map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
    map.put(KEY_DESC, parser.getValue(e, KEY_DESC));
    map.put(KEY_SEVE, parser.getValue(e, KEY_SEVE).replace("1", "High")
            .replace("2", "Medium").replace("3", "Low"));

    menuItems.add(map);

    ListAdapter adapter = new SimpleAdapter(this, menuItems,
            R.layout.list_item, new String[] { KEY_TITLE, KEY_DESC,
                    KEY_DATE, KEY_SEVE }, new int[] { R.id.name,
                    R.id.desciption, R.id.cost, R.id.seve });

    setListAdapter(adapter);

    ListView list = getListView();

    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            String title = ((TextView) view.findViewById(R.id.name))
                    .getText().toString();
            String date = ((TextView) view.findViewById(R.id.cost))
                    .getText().toString();
            String description = ((TextView) view
                    .findViewById(R.id.desciption)).getText()
                    .toString();
            String priority = ((TextView) view.findViewById(R.id.seve))
                    .getText().toString();

            Intent in = new Intent(getApplicationContext(),
                    MenuItemActivity.class);
            in.putExtra(KEY_TITLE, title);
            in.putExtra(KEY_DATE, date);
            in.putExtra(KEY_DESC, description);
            in.putExtra(KEY_SEVE, priority);
            startActivity(in);


    });
}


String value = severity.getText().toString();

if (value.equals("High")) {

    severity.setTextColor(Color.RED);

} else if (value.equals("Medium")) {

    severity.setTextColor(Color.YELLOW);

}
}
}

0

你在onCreate中是否对你的TextView执行了findViewById操作...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接