如何在SpannableString中使用getResources()?

时间:2015-08-08 10:31:51

标签: android spannablestring

我正在创建一个小型Android应用。我想在textview中显示可点击的文本。这是我的代码:

SpannableString ss = new SpannableString("Hello world!");

它正常工作,但如果我从

更改代码
SpannableString ss = new SpannableString(getResources().getString(R.string.hello_world));

$username = 'username';
$password = 'password';

$method = 'GET';
// $method = 'POST';

//  FOR POST METHOD. API REQUIRE THIS FORMAT
// $fields = array('APIRquestData' => '{"name":"value","name1":["v4","v5"]}');

$url = "http://apiurl/getmethodname";
// $url = "http://apiurl/postmethodname";

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch,CURLOPT_TIMEOUT, 30);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 30);
if($method == 'POST')
{
  $fieldsData = http_build_query($fields);
  curl_setopt($ch,CURLOPT_POSTFIELDS, $fieldsData);
}

curl_setopt($ch, CURLOPT_HEADER, 1)
$first_response = curl_exec($ch);
$info = curl_getinfo($ch);

preg_match('/WWW-Authenticate: Digest (.*)/', $first_response, $matches);

if(!empty($matches))
{
  $auth_header = $matches[1];
  $auth_header_array = explode(',', $auth_header);
  $parsed = array();

  foreach ($auth_header_array as $pair)
  {
    $vals = explode('=', $pair);
    $parsed[trim($vals[0])] = trim($vals[1], '" ');
  }

  $response_realm     = (isset($parsed['realm'])) ? $parsed['realm'] : "";
  $response_nonce     = (isset($parsed['nonce'])) ? $parsed['nonce'] : "";
  $response_opaque    = (isset($parsed['opaque'])) ? $parsed['opaque'] : "";

  $authenticate1 = md5($username.":".$response_realm.":".$password);
  $authenticate2 = md5($method.":".$url);

  $authenticate_response = md5($authenticate1.":".$response_nonce.":".$authenticate2);

  $request = sprintf('Authorization: Digest username="%s", realm="%s", nonce="%s", opaque="%s", uri="%s", response="%s"',
  $username, $response_realm, $response_nonce, $response_opaque, $url, $authenticate_response);

  $request_header = array($request);

  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL, $url);
  curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch,CURLOPT_FOLLOWLOCATION, false);
  curl_setopt($ch,CURLOPT_TIMEOUT, 30);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 30);

  if($method == 'POST')
  {
    $fieldsData = http_build_query($fields);
    curl_setopt($ch,CURLOPT_POSTFIELDS, $fieldsData);
  }
  curl_setopt($ch, CURLOPT_HTTPHEADER, $request_header);

  $result['response']         = curl_exec($ch);
  $result['info']             = curl_getinfo ($ch);
  $result['info']['errno']    = curl_errno($ch);
  $result['info']['errmsg']   = curl_error($ch); 
}


/*
I am getting this as response

Array
(
  [response] =>  

  HTTP Status 404 - 
  type Status report
  message 
  description The requested resource () is not available.
  [info] => Array
    (
        [url] => http://apiurl/postmethodname
        [content_type] => text/html;charset=ISO-8859-1
        [http_code] => 404
        [header_size] => 361
        [request_size] => 551
        [filetime] => -1
        [ssl_verify_result] => 0
        [redirect_count] => 0
        [total_time] => 0.109
        [namelookup_time] => 0
        [connect_time] => 0.063
        [pretransfer_time] => 0.063
        [size_upload] => 114
        [size_download] => 956
        [speed_download] => 8770
        [speed_upload] => 1045
        [download_content_length] => 956
        [upload_content_length] => 114
        [starttransfer_time] => 0.109
        [redirect_time] => 0
        [redirect_url] => 
        [primary_ip] => XXX.X.XX.XX
        [certinfo] => Array
            (
            )

        [primary_port] => 80
        [local_ip] => XX.XX.XX.XXX
        [local_port] => 58850
        [errno] => 0
        [errmsg] => 
    )
)
*/

应用程序无法正常工作。 如何在SpannableString中使用getResources()?

1 个答案:

答案 0 :(得分:0)

在xml资源文件中,您可以为它应该工作的非中断空间添加unicode \u00A0 尝试将其添加到您的字符串文件

根据this

然后你可以添加这个

youspannable.setSpan(clickableSpan, the starting index for nonbreaking space, the last index, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
then
textView.setText(youspannable);
textView.setMovementMethod(LinkMovementMethod.getInstance());

这应该在create上,因为你在活动生命周期中过早地调用了getResources()。

所以你的代码应该是这样的

    public class MainActivity extends Activity { 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
SpannableString ss = new SpannableString(getResources().getString(R.string.hello_world));

    final ClickableSpan clickableSpan111 = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            Toast toast = Toast.makeText(getApplicationContext(),
                    ";)",
                    Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
        }
    };
        ss.setSpan(clickableSpan111, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(TextUtils.concat("my text ", ss));
        textView.setMovementMethod(LinkMovementMethod.getInstance());
    }

}