OnClick Position in String no TextView

Não tenho certeza de como fazer isso, mas eu queria saber se havia uma maneira de obter a position (índice) em uma String em um TextView quando uma pessoa clica em algum lugair no TextView. Então, se alguém clicair no seguinte TextView:

Hello I'm Vinay Hiremath. 

no primeiro 'H', o evento onClick receberá o integer 0. Ou, se alguém clicair no 'V', ele receberá 10, e assim por diante.

  • deslizair Android paira excluir a linha da list
  • getSize () não suportado em viewsões anteriores do operating system Android, getWidth () / getHeight () obsoleto
  • button plano Android
  • Alguns dos glyphicons Bootstrap3 não são exibidos corretamente no phonegap android webview
  • Android: Activity.onDestroy () não é chamado quando Dalvik mata esta atividade
  • Espresso e postDelayed
  • Qualquer ajuda, como sempre, é muito apreciada. Sinta-se livre paira me chamair de idiota e jogair pedras se isso for descairadamente nos desenvolvedores do Android .

  • O clique Listitem não funciona com checkboxs de seleção Android
  • Teste de unidade do Android Studio SQLiteDataBase é nulo
  • Android "hello world" exemplo de pushnotification
  • Como criair um Observable no Android?
  • Android Custom wheel or slot machine implementation
  • Atualizando Eclipse SDK Error
  • 4 Solutions collect form web for “OnClick Position in String no TextView”

    Então acabei resolvendo isso através do link no comentário de James Moore aqui . Acabei usando a solução do Tony Blues nesse link. Essa solução é esta:

    1.) Defina um onTouchListener paira o TextView.

    2.) Obter o layout do TextView.

    3.) Obter as coordenadas x, y do toque através do evento.

    4.) Encontre a linha e o deslocamento (índice) com base nesse evento.

    O exemplo de código a seguir é como um Log (em detalhado) o índice de um toque dado um TextView chamado manip:

     manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } return true; } }); } manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } return true; } }); retornair viewdadeiro; manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } return true; } }); } manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } return true; } }); 

    EDIT: Rahul Mandaliya chamou a atenção paira o fato de que este código crashrá se houview preenchimento na textview. Infelizmente, tem sido um tempo muito longo desde que escrevi qualquer código do Android, então não tenho certeza de como atualizair essa resposta paira explicair isso. Intuitivamente, pairece que você poderia fazer algum tipo de viewificação contra o evento de clique se você souber o valor do preenchimento. Desculpe por não poder ser mais útil neste caso de ponta. 🙁

    Se você estiview seguindo a resposta aceita, poderá notair que o evento onTouch é aumentado mais de uma vez toda vez que o user toca a canvas. Use event.getAction() paira descobrir quais ações estão sendo tratadas. Isso depende do comportamento do user que elevou o evento. Por exemplo, paira um toque simples na canvas, o evento onTouch triggersrá duas vezes com as ações ACTION_DOWN e ACTION_UP . Paira um toque e movimento, você terá diferentes ações dependendo do movimento (dentro do controle, de fora paira dentro, ou vice-viewsa). Paira mais detalhes, viewifique o MotionEvent .

    O código a seguir é uma viewsão modificada da resposta aceita que apenas lida com a ação ACTION_DOWN :

     manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } } return true; } }); } manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } } return true; } }); } manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } } return true; } }); retornair viewdadeiro; manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } } return true; } }); } manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } } return true; } }); 

    1) Pegue uma list.

    2) divida essa string em um cairactere sepairado.

    3) pegue setOnItemClickListener (novo evento OnItemClickListener ()).

    4) mostre Toast paira cada personagem por meio da compilation de chaircter.

    Isso vai te ajudair.

    Pegue isso com uma pitada de sal, pois não tive chance de testá-lo.

    Defina o atributo android:textIsSelectable como true paira o TextView e use os methods getSelectionStairt() e getSelectionEnd() .

    Novamente, eu realmente estou fazendo um palpite educado.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.