2013-07-06 9 views
5

Mam błędy składniowe z moim kodem, w "getView" Chcę uczynić detektor dla przycisku "update" "przenieść się do innej aktywności:Sposób naprawy Metoda startActivity (Intent) jest niezdefiniowana dla typu new View.OnClickListener() błąd składni

enter image description here

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 


     LayoutInflater l = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
     View rowView = l.inflate(R.layout.temp, parent, false); 
     TextView textView = (TextView) rowView.findViewById(R.id.textView1); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView1); 
     Button update = (Button) rowView.findViewById(R.id.button1); 

//  update.setOnClickListener(new View.OnClickListener() { 
//   
//   @Override 
//   public void onClick(View v) { 
// 
//     Intent redirect = new Intent(getApplicationContext(),Update.class); 
//     startActivity(redirect); 
//    
//   } 
//  }); 




     textView.setText(sa.get(position)); 


     return rowView; 
    } 

próbowałem naprawić te błędy o "intencyjny", ale nie udało mi się :(

  1. metoda startActivity (zamiar) jest u ndefined dla nowego typu View.OnClickListener()

  2. Sposób getApplicationContext() jest zdefiniowana dla nowego typu View.OnClickListener()

a nawet whene przeniosłem te stwierdzenia z "onclick" metoda problem się nie zmienił !! Zaimportowałem bibliotekę "Intent", jak to rozwiązać ????

+0

jest klasa adapter w innym pliku? – Raghunandan

Odpowiedz

14

Jeśli karta jest w inny plik wymaga kontekstu działania.

Musisz przekazać kontekst działania z klasy aktywności do konstruktora adaptera.

http://developer.android.com/reference/android/content/Context.html#startActivity(android.content.Intent)

startActivity to metoda klasy aktywności. Potrzebujesz więc kontekstu aktywności, aby rozpocząć działanie.

Również zamiast getApplicationContext należy użyć kontekstu działania.

When to call activity context OR application context?

Sprawdź odpowiedź przez commonsware.

 update.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Intent redirect = new Intent(context,Update.class); 
      context.startActivity(redirect);  
     } 
     }); 
+1

@Akari cieszy się, że pomógł. – Raghunandan

+0

wszystko jest w porządku :)))) – Akari

2

Spróbuj

final Activity thisActivity = this; 

update.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Intent redirect = new Intent(thisActivity,Update.class); 
       thisActivity.startActivity(redirect); 

      } 
     }); 
1

Wystarczy zadzwonić context.startActivity Zamiast tego można wykonać poniższe kroki

trzech prostych krokach

1) deklaruje zmienna lokalna Context mCtx

2) intialize go Kontekst działania albo przez przekazanie parametru do konstruktora/metody, albo w metodzie onCreate, jeśli korzystasz z powyższej współpracy de w działalności.

3) nazywamy mCtx.startActivity(intent);

lub

można nazwać ActivityName.this.startActivity()

Edycja: - Jak nominalnej komentarzu DMON, po prostu mogą korzystać z lokalnego wystąpienie kontekstowe

+0

W tej metodzie jest już zmienna kontekstowa. – dmon

0

Źródłem problemu jest to, że nie można rozpocząć działalność z kontekstu aplikacji (tylko z kontekstu aktywności masz prawo to zrobić).Powodem tego jest to, że Android łączy wszystkie działania aplikacji jako grupę (zadanie), aby umożliwić wielozadaniowość między różnymi aplikacjami. Kiedy uruchamiasz nową aplikację lub naciskasz na przykład przycisk home, to aplikacja (wraz z backstackiem działań) przechodzi w tło i zostawia scenę do nowego zadania (z innym pismem aktywności i tak dalej i tak dalej)). Więcej informacji na temat tego mechanizmu można znaleźć tutaj (http://developer.android.com/guide/components/tasks-and-back-stack.html).

Aby uzyskać kontekst, w którym można uzyskać nową aktywność, zawsze można uzyskać kontekst rodzica widoku, który nadpisujesz, wywołując metodę viewgroup.getContext() - mimo że będziesz musiał zadeklarować grupa przeglądowa jako ostateczna, co jest ok, ponieważ nie powinno się dotykać rodzica.

projekt swojej getView:

@Override 
public View getView(int position, View convertView, final ViewGroup parent) { 


    LayoutInflater l = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
    View rowView = l.inflate(R.layout.temp, parent, false); 
    TextView textView = (TextView) rowView.findViewById(R.id.textView1); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView1); 
    Button update = (Button) rowView.findViewById(R.id.button1); 

    update.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent redirect = new Intent(parent.getContext(),Update.class); 
      startActivity(redirect); 
     } 
    }); 




    textView.setText(sa.get(position)); 


    return rowView; 
} 
2

na podobnym problemem dla mnie właśnie to pomogło mi:

@Override 
    public void onClick(View v) { 
        Intent intent = new Intent(G.context, SecondActivity.class); 
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        G.context.startActivity(intent); 
    } 
    }); 

kontekst dodatek w G Class:

public class G extends Activity { 

    public static Context context; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     context = getApplicationContext(); 

    } 
} 
Powiązane problemy