2013-02-27 4 views
0

Я новичок в Android, и я все еще пытаюсь склонить голову к некоторым из этих концепций, поэтому мне жаль, если я должен просить о частых разъяснениях.Передача аргументов/параметров в OnClickListener()

Я пытаюсь переопределить/создать свой собственный OnClickListener. Тем не менее, я получаю эту ошибку, говоря, что startActivity(Intent) не определен для моего класса ... и я не могу понять, почему я получаю эту ошибку.

import android.content.ActivityNotFoundException; 
import android.content.Intent; 
import android.net.Uri; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 

public class ContactOCL implements OnClickListener { 
    String contactInfo; 
    public ContactOCL(String contactInfo) { 
     this.contactInfo = contactInfo; 
    } 

    public void onClick(View v) { 
     try { 
      Intent callIntent = new Intent(Intent.ACTION_CALL); 
      callIntent.setData(Uri.parse("tel:" + contactInfo)); 
      startActivity(callIntent); // Error here 
     } catch (ActivityNotFoundException activityException) { 
      Log.e("Calling a Phone Number", "Call failed", activityException); 
     } 
    } 

} 
+0

Разместить свои ошибки LogCat. – Barney

+2

Barney: Это ошибка времени компиляции. –

+0

Является ли намерение/класс объявленным в вашем манифесте? –

ответ

6

Поскольку у вас уже есть View, переданный в onClick(), вам не нужно также передавать Деятельности окружающему классу. Вобще:

v.getContext().startActivity(callIntent); 
+1

+1 Лучшее решение, чем один я имел. Я должен сказать себе: «Держите это просто, глупо» –

+2

При нормальных обстоятельствах ваш путь - это путь :-) –

5

Чтобы начать свою деятельность, вам необходимо заняться деятельностью.

Одно решение пройти по вашей деятельности к классу ContactOCL

public ContactOCL(Activity activity, String contactInfo) { 
    this.contactInfo = contactInfo; 
    this.activity = activity; 
} 

Затем, чтобы начать свою деятельность, вы используете

activity.startActivity(callIntent);

Затем, когда вы создаете этот класс ContactOCL, вы добавив параметр активности, например: new ContactOCL(this, contactInfo); (Предполагаю, что вы создаете ContactOCL из своего класса активности)

Редактировать: Хотя мое решение работает в общем случае, для этого частного случая нет необходимости делать это так, так как вы можете получить доступ к активности из представления. Вместо этого см. solution suggested by A--C here.

1

Этот класс будет работать как внутренний класс в Activity - просто его и удалить public класса модификатор:

public class MyActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    class ContactOCL implements OnClickListener { 
     String contactInfo; 
     public ContactOCL(String contactInfo) { 
      this.contactInfo = contactInfo; 
     } 

     public void onClick(View v) { 
      try { 
       Intent callIntent = new Intent(Intent.ACTION_CALL); 
       callIntent.setData(Uri.parse("tel:" + contactInfo)); 
       startActivity(callIntent); // No Error here 
      } catch (ActivityNotFoundException activityException) { 
       Log.e("Calling a Phone Number", "Call failed", activityException); 
      } 
     } 

    } 
} 
+0

+1. Так я обычно это делаю. Иногда я предпочитаю чрезмерно использовать внутренние классы :) –

Смежные вопросы