Autore Topic: Usare setOnClickListener in una classe e richiamarla nel main  (Letto 1001 volte)

Offline cimo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    S3
  • Sistema operativo:
    Cyanogenmod 11
Usare setOnClickListener in una classe e richiamarla nel main
« il: 09 Giugno 2014, 12:04:48 CEST »
0
Ciao a tutti sono nuovo su del forum e mi chiedevo se potevate aiutarmi a risolvere questo problema.
Vorrei fare in modo di chiamare il mio setOnClickListener della classe "MyModuleMenu" nella classe "MyActivity" (il main).
Voglio evitare di scrivere tutto li e voglio spezzettare il codice.

Ora mi spiego meglio con il mio codice:

"MyModuleMenu" -> classe java
Codice (Java): [Seleziona]
package com.reinventSoftware.benkyou;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MyModuleMenu extends Activity {
    Button _button_1;
   
    /**
     * Called when the activity is first created.
     */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_module_menu);

        _button_1 = (Button) findViewById(R.id.buttonAAA);

        _button_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(this, my_activity_verb.class);
                startActivity(intent);
            }
        });
    }

    public void MyModuleMenu() {

    }
}
Ho assegnato al bottone del menu "my_module_menu -> buttonAAA" il click e vorrei aprire la nuova vista "my_activity_verb".
Solo che ricevo un errore "Error:(25, 33) java: no suitable constructor found for Intent(<anonymous android.view.View.OnClickListener>,java.lang.Class<com.reinventSoftware.benkyou.my_activity_verb>)
    constructor android.content.Intent.Intent(java.lang.String,android.net.Uri) is not applicable
      (argument mismatch; <anonymous android.view.View.OnClickListener> cannot be converted to java.lang.String)
    constructor android.content.Intent.Intent(android.content.Context,java.lang.Class<?>) is not applicable
      (argument mismatch; <anonymous android.view.View.OnClickListener> cannot be converted to android.content.Context)".

"my_module_menu.xml" -> layout
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="match_parent"
               android:layout_height="wrap_content">
    <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/my_module_menu_title"
           android:id="@+id/textView"/>

    <Button
           android:layout_width="wrap_content"
           android:layout_height="@dimen/button_height"
           android:text="@string/my_module_menu_button_1"
           android:id="@+id/buttonAAA"
           android:layout_below="@+id/textView"/>

    <Button
           android:layout_width="wrap_content"
           android:layout_height="@dimen/button_height"
           android:text="@string/my_module_menu_button_2"
           android:id="@+id/button2"
           android:layout_below="@+id/buttonAAA"
           android:onClick="toShow_my_activity_word"/>

    <Button
           android:layout_width="wrap_content"
           android:layout_height="@dimen/button_height"
           android:text="@string/my_module_menu_button_3"
           android:id="@+id/button3"
           android:layout_below="@+id/button2"
           android:onClick="toShow_my_activity_phrase"/>
</RelativeLayout>
Questo lo richiamo dal main con un include
Codice (XML): [Seleziona]
...
<!-- my_module_menu -->
<include
        layout="@layout/my_module_menu"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
...

Ecco qui...come faccio a usare un listener nella classe "MyModuleMenu" con il rispettivo layout "my_module_menu.xml" e richiamarli nel main?

Grazie anticipatamanete!
« Ultima modifica: 24 Giugno 2014, 15:51:46 CEST da cimo »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #1 il: 09 Giugno 2014, 12:38:33 CEST »
0
Se leggi bene la descrizione dell'errore, il problema è nel contesto, perchè quando crei l'Intent il this non è quello dell'activity. Al posto del this prova a mettere view.getContext().



NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline cimo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    S3
  • Sistema operativo:
    Cyanogenmod 11
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #2 il: 09 Giugno 2014, 14:10:01 CEST »
0
Grazie per la risposta.
Fatto, l'applicazione parte ma quando premo il tasto niente, ho debaggato e non calcola per niente la classe.
Questo layout viene incluso nel layout del main (contiene solo un menù).
Altro consiglio?
« Ultima modifica: 09 Giugno 2014, 15:16:18 CEST da cimo »

iClaude

  • Visitatore
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #3 il: 10 Giugno 2014, 10:46:41 CEST »
0
Prova anche con MyModuleMenu.this al posto di this. Se non è questo l'errore deve essere da qualche altra parte...

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #4 il: 10 Giugno 2014, 12:36:01 CEST »
0
e la spiegazione è che nel tuo caso this fa riferimento all'inner class OnClickListener e non all'Activity.
facendo come dice IClaude invece ti riferisci all'Activity, se non risolvi neppure in quel modo prova a ripostare tutto il codice.
Let Your Brain Run Away

Offline cimo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    S3
  • Sistema operativo:
    Cyanogenmod 11
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #5 il: 10 Giugno 2014, 14:40:59 CEST »
0
Grazie davvero per le risposte!

Allora non va..non dà errori ma debaggando non calcola per niente l'activity.

"activity_main.xml"
Codice (XML): [Seleziona]
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           tools:context="${packageName}.${activityClass}"
           android:id="@+id/scrollView"
           android:fillViewport="true">

        <LinearLayout
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:orientation="vertical">
            <!-- my_module_lang -->
            <com.reinventSoftware.benkyou.MyModuleLang
                   layout="@layout/my_module_lang"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"/>
            <!-- my_module_menu -->
            <include
                   layout="@layout/my_module_menu"
                   android:layout_width="match_parent"
                   android:layout_height="0dp"
                   android:layout_weight="1"/>
            <!-- my_module_helper -->
            <com.reinventSoftware.benkyou.MyModuleHelper
                   layout="@layout/my_module_helper"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"/>
        </LinearLayout>

    </ScrollView>
Con un include inserisco nel main "my_module_menu.xml"
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="match_parent"
               android:layout_height="wrap_content">

    <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/my_module_menu_title"
           android:id="@+id/my_module_menu_textView"/>

    <Button
           android:layout_width="wrap_content"
           android:layout_height="@dimen/button_height"
           android:text="@string/my_module_menu_button_1"
           android:id="@+id/my_module_menu_button_1"
           android:layout_below="@+id/my_module_menu_textView"/>

    <Button
           android:layout_width="wrap_content"
           android:layout_height="@dimen/button_height"
           android:text="@string/my_module_menu_button_2"
           android:id="@+id/my_module_menu_button_2"
           android:layout_below="@+id/my_module_menu_button_1"/>

    <Button
           android:layout_width="wrap_content"
           android:layout_height="@dimen/button_height"
           android:text="@string/my_module_menu_button_3"
           android:id="@+id/my_module_menu_button_3"
           android:layout_below="@+id/my_module_menu_button_2"/>

</RelativeLayout>
E da qui richiamo "my_activity_verb.xml" con il relativo contenuto.

"MainActivity.java"
Codice (Java): [Seleziona]
package com.reinventSoftware.benkyou;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

"MyModuleMenu.java"
Codice (Java): [Seleziona]
package com.reinventSoftware.benkyou;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MyModuleMenu extends Activity {
    Button _button_1;
   
    /**
     * Called when the activity is first created.
     */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_module_menu);

        _button_1 = (Button) findViewById(R.id.my_module_menu_button_1);

        _button_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MyModuleMenu.this, MyActivityVerb.class);
                startActivity(intent);
// qui debaggo ma non entra per niente!!!
            }
        });
    }

    public void MyModuleMenu() {

    }
}

"MyActivityVerb.java"
Codice (Java): [Seleziona]
package com.reinventSoftware.benkyou;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;

public class MyActivityVerb extends Activity {
    /**
     * Called when the activity is first created.
     */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity_verb);

        ImageView _helper_image = (ImageView) findViewById(R.id.my_module_helper_girl_1);
        _helper_image.setImageResource(R.drawable.my_module_helper_girl_2);
    }
}

Non mi visualizza l'activity "my_activity_verb" e se clicco sul bottone non fa niente.

Ho provato con l'inflate (come potete vedere dai richimi nell'xml come per esempio "com.reinventSoftware.benkyou.MyModuleHelper") e in quel modo funziona ma poi ho problemi a trovare gli elementi con il rispettivo id...

Qual'è la strada migliore da seguire e come risolvo questo problema?!?
Grazie...
« Ultima modifica: 10 Giugno 2014, 15:27:35 CEST da cimo »

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #6 il: 10 Giugno 2014, 15:21:19 CEST »
0
Mi sfugge qualcosa,
da quello che vedo credo che manchi l'Activity MainActivity che afferisce al layout activity_main.xml corretto?

quindi l'Activity che parte è la MainActivity che però ha incluso dentro di sè il layout my_module_menu.xml

L'Activity MyModuleMenu non è stata però creata per cui non partirà l'OnCreate e di conseguenza è normale che non vada nell'onClick.

Cosa mi sfugge?
Let Your Brain Run Away

Offline cimo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    S3
  • Sistema operativo:
    Cyanogenmod 11
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #7 il: 10 Giugno 2014, 15:30:39 CEST »
0
Modificato è ho inserito il "MainActivity.java" nel post ma è solo il file di avvio del main, non contiene nient'altro.

Si infatti non lo vede perche' non la fa partire è solo un include...

Io voglio includere il menu e scrivere dentro la classe del menu i rispettivi click e fare in modo che dentro i click vada a richiamare elementi del main.

I problemi sono due, se uso include non funziona onCreate.

Se uso inflater funziona il click ma non riesco a prendere oggetti nel main...

Cosa mi consigli di fare?

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #8 il: 10 Giugno 2014, 15:38:56 CEST »
0
Mantenendo disaccoppiati i layouts una soluzione del genere ti piacerebbe?

Codice (Java): [Seleziona]
public class MainActivity extends Activity {
        Button _button_1;
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

               
                 _button_1 = (Button) findViewById(R.id.my_module_menu_button_1);

                _button_1.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent intent = new Intent(MainActivity.this, MyActivityVerb.class);
                        startActivity(intent);
        // qui debaggo ma non entra per niente!!!
                    }
                });
        }

}
Let Your Brain Run Away

Offline cimo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    S3
  • Sistema operativo:
    Cyanogenmod 11
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #9 il: 10 Giugno 2014, 15:45:55 CEST »
0
Ti ringrazio per la risposta ma non voglio scrivere nel main vorrei fare in modo da scrivere nelle rispettive classi...come devo fare?

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #10 il: 10 Giugno 2014, 15:50:08 CEST »
0
Se vuoi mantenere sia codice che layout disaccoppiati forse dovresti prendere in considerazione l'utilizzo di Fragments.
Let Your Brain Run Away

Offline cimo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    S3
  • Sistema operativo:
    Cyanogenmod 11
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #11 il: 10 Giugno 2014, 15:53:18 CEST »
0
Quindi da un layout con inflater non e' possibile accedere al root xml?

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #12 il: 10 Giugno 2014, 16:18:32 CEST »
0
Sull'utilizzo degli inflate così non mi è mai capitato di ragionarci, posteresti il codice con la versione Inflate?
Let Your Brain Run Away

Offline cimo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    S3
  • Sistema operativo:
    Cyanogenmod 11
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #13 il: 10 Giugno 2014, 16:25:04 CEST »
0
Certo eccolo

"MyModuleMenuAction.java"
Codice (Java): [Seleziona]
public class MyModuleMenuAction extends LinearLayout {
       
        private LayoutInflater inflater;
       
        private RelativeLayout _verb_wrapper;

    public MyModuleMenuAction(Context context, AttributeSet attrs) {
        super(context, attrs);

        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.my_module_menu_action, this, true);
       
        ((Button) view.findViewById(R.id.my_module_menu_action_button_1)).setOnClickListener(toAbort_verb);
       
        // come prendo findViewById(R.id.my_activity_verb_wrapper) ?
    }
   
    private OnClickListener toAbort_verb = new OnClickListener() {
        public void onClick(View view) {
            _verb_wrapper.setVisibility(view.INVISIBLE);
        }
    };
}

"my_activity_verb"
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:id="@+id/my_activity_verb_wrapper"
       android:fillViewport="true">

    <LinearLayout
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="vertical">
        <!-- title -->
        <TextView
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:text="@string/my_activity_verb_title"/>
        <!-- my_module_search -->
        <include
               layout="@layout/my_module_search"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"/>
        <!-- my_module_verb -->
        <com.reinventSoftware.benkyou.MyModuleVerb
               layout="@layout/my_module_verb"
               android:layout_width="match_parent"
               android:layout_height="0dp"
               android:layout_weight="1"/>
        <!-- my_module_menu_action -->
        <com.reinventSoftware.benkyou.MyModuleMenuAction
               layout="@layout/my_module_menu_action"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"/>
        <!-- my_module_helper -->
        <com.reinventSoftware.benkyou.MyModuleHelper
               layout="@layout/my_module_helper"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"/>
    </LinearLayout>

</ScrollView>
Da qui includo il menu del file java "MyModuleMenuAction"

Voglio che se clicco sul bottone mi nasconde o mostra l'elemento "com.reinventSoftware.benkyou.MyModuleVerb"...come faccio?

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Usare setOnClickListener in una classe e richiamarla nel main
« Risposta #14 il: 10 Giugno 2014, 16:54:41 CEST »
0
Bene ed in questo caso la MainActivity come è definita?
Let Your Brain Run Away