0

だから私は長い間これを探していて、たくさんのことを試しましたが、うまくいかないようです...私は最近Androidのプログラミングを始めました、そして私はのためのチャットアプリケーションを作っていますWebサイト。

これで、アプリケーションにスマイリー/顔文字を追加したいところに到達しました。検索すると、次のWebサイトが見つかりました。http: //blog.stylingandroid.com/archives/177 http://www.coderanch.com / t / 488673 / Android / Mobile /styling-items-ListView

私のコード:

private void updateList()
{
    ListView list = this.getListView();

    if(!parsedData.isEmpty())
    {
        ArrayAdapter<String> adapter = new MyAdapter(this, R.layout.list_item, parsedData);

    list.setAdapter(adapter);
    list.setTextFilterEnabled(true);
    }
}

class MyAdapter extends ArrayAdapter<String>
{
    ArrayList<String> mStrings;
    LayoutInflater mInflater; 

    public MyAdapter(Context context, int textViewResourceId, ArrayList<String> parsedData)
    {
        super(context, textViewResourceId, parsedData);
        mStrings = parsedData;
        mInflater = (LayoutInflater) HopeloosChatActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if (convertView == null)
        {
            convertView = mInflater.inflate(R.layout.main, null, false);  
        }

        TextView text = (TextView)convertView.findViewById(R.id.TextView);
        SpannableStringBuilder ssb = new SpannableStringBuilder("Test  ");
        Bitmap emoticon = BitmapFactory.decodeResource( getResources(), R.drawable.icon);
        ssb.setSpan(new ImageSpan(emoticon), 5, 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
        text.setText(ssb, BufferType.SPANNABLE);

        return convertView;
    }
}

私はsetContentView(R.layout.main);を使用します。OnCreate()メソッドで

私のmain.xmlには、ListViewの部分が含まれています。

<ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" />

また、list_item.xmlにはTextViewが含まれています。

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp"
android:autoLink="web"
android:linksClickable="true" >
</Textview>

コードを実行すると、テキストがnullであるため、Nullpointerが取得され、行き詰まります。誰かが私を正しい方向に向けたり、私を少し助けてくれますか?

前もって感謝します!

4

2 に答える 2

1

まず、以下のような1つのハッシュマップを取得します。

private static final HashMap<String, Integer> emoticons = new HashMap<String, Integer>();
static {
  emoticons.put(":)", R.drawable.smilie1);}

次に、スマイリーテキストを画像に変換する関数を記述します

// Get image for each text smiles
public static Spannable getSmiledText(Context context, String text) {
      SpannableStringBuilder builder = new SpannableStringBuilder(text);
      int index;
      for (index = 0; index < builder.length(); index++) {
        for (Entry<String, Integer> entry : emoticons.entrySet()) {
          int length = entry.getKey().length();
          if (index + length > builder.length())
            continue;
          if (builder.subSequence(index, index + length).toString().equals(entry.getKey())) {
            builder.setSpan(new ImageSpan(context, entry.getValue()), index, index + length,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            index += length - 1;
            break;
          }
        }
      }
      return builder;
    }

第三に、テキストを送信するとき、すべてのテキストを赤くし、「:)」が含まれている場合は、次のように関数を呼び出します

chattext.(getSmiledText(getApplicationContext(),":)"));

それが役に立てば幸い!ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-08-04T05:29:03.583 に答える
0

convertViewあなたは以下を使用して膨らませていR.layout.mainます:

convertView = mInflater.inflate(R.layout.main, null, false);

これは正しくありません。あなたはListView毎回あなたのレイアウトを膨らませています。代わりにこれを使用してください:

convertView = mInflater.inflate(R.layout.list_item, null, false);

さらに、TextViewレイアウトでラップする必要があります。または、それ自体でconvertViewある可能性があり、その上では機能しません。TextViewfindViewById(...)実際、@ Jensのおかげで、この取り消し線付きのテキストは適用されません。findViewById探しているのと同じオブジェクトで使用しても、引き続き機能します。

于 2012-08-04T00:46:14.717 に答える