2017-05-19 2 views
0

J'ai travaillé sur certains View de coutume dans une activité. Maintenant, disons que nous avons aussi EditText dans cette activité. Et je veux que mon View personnalisé obtienne la valeur en EditText quand je touche ce View (ce qui signifie que je veux que cela soit fait en méthode onTouch). Le problème est, j'ai travaillé sur mon View personnalisé sur la classe séparée, et je ne peux pas trouver un moyen d'obtenir ce fait. J'ai d'abord pensé à utiliser la méthode findViewbyId pour obtenir un identifiant, mais il semble que ce soit possible. Ainsi, toutes les aides ou les idées sont grandement appréciées.comment obtenir la chaîne de EditText à la vue personnalisée

Voici quelques codes pour mon projet:

activity.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_nono" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:orientation="vertical" 
    tools:context="snacker.nonogramsolver.NonoActivity"> 

    <snacker.nonogramsolver.Nono /* MY CUSTOM VIEW */ 
     android:id="@+id/NonoView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

     ... /*some elements are here, not important for this question*/ 

    <EditText 
     android:id="@+id/line_input" 
     android:layout_width="200dp" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

Ma vue personnalisée fichier java:

package snacker.nonogramsolver; 

import ...; 

public class Nono extends View implements View.OnTouchListener{ 
... /* some variables */ 

    public Nono(){ 
     super(null); 
    }; 

    public Nono(Context context){ 
     super(context); 
     //initializeBoard(10,10); 
     mCellWidth = mCellHeight = this.getWidth()/(mWidth); 
    } 

    public Nono(Context context, AttributeSet attrs){ 
     super(context, attrs); 
     ...} 

    ... /* SOME CODES ARE HERE, NOT IMPORTANT FOR THIS QUESTION */ 

    public boolean onTouch(View v, MotionEvent event){ 
     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      mXNow = getCol(event.getX()); 
      mYNow = getRow(event.getY()); 
      if(mYNow == -1 && mXNow != -1){ 
       /* THIS IS WHERE I WANT THIS METHOD TO GET VALUE FROM EDITTEXT */ 
      } 
      invalidate(); 
      return true; 
     } 
     return false; 
    } 

et mon fichier java d'activité:

public class NonoActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ; 

     setContentView(R.layout.activity_nono); 
     Intent intent = getIntent(); 
     int width = intent.getIntExtra("width", 5); 
     int height = intent.getIntExtra("height", 5); 

     Button btn = (Button)findViewById(R.id.btn_clear); 
     Nono sdk = (Nono)findViewById(R.id.NonoView); 



     sdk.setOnTouchListener(sdk); 
     sdk.initializeBoard(width,height); 
     btn.setOnClickListener(new Button.OnClickListener(){ 
      public void onClick(View v){ 
       Nono sdk = (Nono)findViewById(R.id.NonoView); 
       sdk.initializeBoard(sdk.mWidth,sdk.mHeight); 
      } 
     }); 

    } 
} 
+0

Devrait fonctionner avec 'sdk.findViewById (R.id.line_input)' – cYrixmorten

+0

Quelle est votre disposition pour 'Nono'? –

+1

@cYrixmorten résolu. Hum, ceci est embarrassant. Je n'ai pas pensé à utiliser R.id ici aussi. Mais, pouvez-vous me dire pourquoi je peux utiliser R ici aussi? Est-ce que R contient tous les identifiants de ce paquet? Je suis assez nouveau pour Android, donc je pensais que R était utilisé comme local. – SnackerH

Répondre

0

Résolu merci t o cYrixmorten. J'ai pu utiliser la méthode findViewById(R.id.line_input). Je n'ai pas pensé à utiliser R.id ici.

donc ce que mon code devrait être serait comme ceci:

public boolean onTouch(View v, MotionEvent event){ 
     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      mXNow = getCol(event.getX()); 
      mYNow = getRow(event.getY()); 
      if(mYNow == -1 && mXNow != -1){ 
       EditText sdk = (EditText)findViewById(R.id.line_input); 
       String linetext = sdk.getText().toString(); 
       /* continue my work */ 
      } 
      invalidate(); 
      return true; 
     } 
     return false; 
    } 

Encore une fois, je donne mes remerciements.

EDIT: Il semble que findViewById renvoie null lorsqu'il est appelé avec l'ID des vues de frère. Donc, il semble que je dois mettre en œuvre la méthode externe pour obtenir l'ID, ne pas utiliser findViewById directement dans CustomView.