Autore Topic: Errore relativo ai fragment  (Letto 739 volte)

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Errore relativo ai fragment
« il: 12 Dicembre 2014, 17:34:51 CET »
0
Il seguente programma mi da errore a run-time, non capisco il perche'.
I due LinearLayout vengono visualizzati correttamente, ma quando clicco su "Bottone 1" mi appare il messaggio
d'errore, allego il LogCat.

Al posto dei <fragment> ho scritto due <LinearLayout>, dovrebbe andare bene lo stesso, se invece dei
<LinearLayout> scrivo <fragment> il programma mi da errore a run-time subito, appena partito.

Ho letto la documentazione ufficiale ma NON riesco a far funzionare il programma, qualcuno puo' aiutarmi?
Puo' dirmi dove sbaglio?
Puo' dirmi dove sbaglio senza indicarmi un link di testo ma spiegandomi l'errore A PAROLE?

********** MainActivity.java **********
Codice (Java): [Seleziona]
package com.prove.provafragment18;

import android.support.v4.app.FragmentActivity;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends FragmentActivity implements Fragment1.NoticeDialogListener
{

    public void onDialogPositiveClick(String s)
    {
        Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
    }

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

        if (savedInstanceState==null)
        {
            Fragment1 frag1=new Fragment1();
            Fragment2 frag2=new Fragment2();

            getSupportFragmentManager().beginTransaction()
                .add(R.id.contenitore1,frag1)
                .add(R.id.contenitore2,frag2)
                .commit();
        }
    }

}

********** Fragment1.java **********
Codice (Java): [Seleziona]
package com.prove.provafragment18;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

/**
 * A simple {@link Fragment} subclass.
 *
 */

public class Fragment1 extends Fragment {

    public interface NoticeDialogListener {
        public void onDialogPositiveClick(String s);
    }

    NoticeDialogListener mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mListener = (NoticeDialogListener) activity;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        return inflater.inflate(R.layout.fragment_fragment1, container, false);
    }

    public void premutoBottone1(View v)
    {
        mListener.onDialogPositiveClick("Stringa");
    }
}

********** Fragment2.java **********
Codice (Java): [Seleziona]
package com.prove.provafragment18;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * A simple {@link Fragment} subclass.
 *
 */

public class Fragment2 extends Fragment {


    public Fragment2() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_fragment2, container, false);
    }
}

********** activity_main.xml **********
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:orientation="vertical"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin"
   tools:context=".MainActivity">

    <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="200dp"
       android:id="@+id/contenitore1"
      >
    </LinearLayout>

    <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="200dp"
       android:id="@+id/contenitore2"
       >
    </LinearLayout>


</LinearLayout>

********** fragment_fragment1.xml **********
Codice (XML): [Seleziona]
<LinearLayout 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="com.prove.provafragment18.Fragment1">

    <!-- TODO: Update blank fragment layout -->
    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Bottone 1"
       android:onClick="premutoBottone1"
       android:id="@+id/button" />

    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Bottone 2"
       android:id="@+id/button2" />

</LinearLayout>

********** fragment_fragment2.xml **********
Codice (XML): [Seleziona]
<FrameLayout 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="com.prove.provafragment18.Fragment2">

    <!-- TODO: Update blank fragment layout -->
    <TextView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:text="@string/hello_blank_fragment" />

</FrameLayout>

********** LogCat **********
Codice: [Seleziona]
12-12 11:31:13.732    2349-2349/com.prove.provafragment18 E/ResourceType﹕ Style contains key with bad entry: 0x01010479
12-12 11:31:19.203    2349-2349/com.prove.provafragment18 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException: Could not find a method premutoBottone1(View) in the activity class com.prove.provafragment18.MainActivity for onClick handler on view class android.widget.Button with id 'button'
            at android.view.View$1.onClick(View.java:3620)
            at android.view.View.performClick(View.java:4240)
            at android.view.View$PerformClick.run(View.java:17721)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NoSuchMethodException: premutoBottone1 [class android.view.View]
            at java.lang.Class.getConstructorOrMethod(Class.java:423)
            at java.lang.Class.getMethod(Class.java:787)
            at android.view.View$1.onClick(View.java:3613)
            at android.view.View.performClick(View.java:4240)
            at android.view.View$PerformClick.run(View.java:17721)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Errore relativo ai fragment
« Risposta #1 il: 12 Dicembre 2014, 23:18:39 CET »
0
Sta cercando il metodo premutoBottone1 nella classe MainActivity (com.prove.provafragment18.MainActivity) mentre il metodo è definito in Fragment1.

Modifica l'xml e prova ad esplicitare fragment1.

android:onClick="com.prove.provafragment18.Fragment1.premutoBottone1"

 :-)

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Errore relativo ai fragment
« Risposta #2 il: 13 Dicembre 2014, 00:46:26 CET »
0
Ho modificato "android:onClick" come mi hai detto ma e' tutto come prima.
Questo e' il LogCat:

Codice: [Seleziona]
12-12 18:41:36.432      792-792/com.prove.provafragment18 E/ResourceType﹕ Style contains key with bad entry: 0x01010479
12-12 18:41:42.731      792-792/com.prove.provafragment18 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException: Could not find a method com.prove.provafragment18.Fragment1.premutoBottone1(View) in the activity class com.prove.provafragment18.MainActivity for onClick handler on view class android.widget.Button with id 'button'
            at android.view.View$1.onClick(View.java:3620)
            at android.view.View.performClick(View.java:4240)
            at android.view.View$PerformClick.run(View.java:17721)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NoSuchMethodException: com.prove.provafragment18.Fragment1.premutoBottone1 [class android.view.View]
            at java.lang.Class.getConstructorOrMethod(Class.java:423)
            at java.lang.Class.getMethod(Class.java:787)
            at android.view.View$1.onClick(View.java:3613)
            at android.view.View.performClick(View.java:4240)
            at android.view.View$PerformClick.run(View.java:17721)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Errore relativo ai fragment
« Risposta #3 il: 13 Dicembre 2014, 09:08:03 CET »
0
Allora temo che tu debba farlo da codice.
Non sono sicuro che il fragment gestisca i click.
Se vuoi gestirlo nel fragment imlementa onclicklistener e poi prendi un riferimento al bottone quando fai l'inflate della via e fai setonclicklistener(this);

Purtroppo credo che l'xml non funzioni, lui fa riferimento sempre all'activity.

 :-(

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Errore relativo ai fragment
« Risposta #4 il: 13 Dicembre 2014, 09:15:50 CET »
0
Puoi farmi un piccolo esempio di codice per favore?

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Errore relativo ai fragment
« Risposta #5 il: 13 Dicembre 2014, 12:22:18 CET »
0
Se vuoi gestire il bottone nel fragment rimuovi la onclick dall'XML.

Poi dichiari il tuo fragment così:

Codice (Java): [Seleziona]
public class Fragment1 extends Fragment implements OnClickListener
All'interno di Fragment1 dichiari il bottone:

Codice (Java): [Seleziona]
Button myButton = null;
Poi nella onCreateView prendi la view con l'inflate, da essa carichi il bottone e poi setti il listener:

Codice (Java): [Seleziona]
View rootView = inflater.inflate(R.layout.fragment_fragment1,container, false);
myButton = (Button) rootView.findViewById(R.id.button);
myButton.setOnClickListener(this);
return rootView;

infine implementi la onclick:

Codice (Java): [Seleziona]
        @Override
        public void onClick(View arg0) {
                switch( arg0.getId() ){
                case R.id.button:
// gestisci qui il click del bottone
                        break;
                default:
                        break;
                }
        }

 :-)

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Errore relativo ai fragment
« Risposta #6 il: 13 Dicembre 2014, 14:14:02 CET »
0
Ho seguito le tue indicazioni e adesso il programma FUNZIONA, grazie.

Una domanda:
In Eclipse e' possibile "clonare" un progetto (basta selezionare il progetto e poi premere Ctrl+C e Ctrl+V), e' possibile fare la stessa cosa anche con Android Studio?

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Errore relativo ai fragment
« Risposta #7 il: 13 Dicembre 2014, 15:32:49 CET »
0
In Eclipse e' possibile "clonare" un progetto (basta selezionare il progetto e poi premere Ctrl+C e Ctrl+V), e' possibile fare la stessa cosa anche con Android Studio?
Non saprei... uso ancora Eclipse.  :-)

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Errore relativo ai fragment
« Risposta #8 il: 13 Dicembre 2014, 19:33:45 CET »
0
Riguardo al programma con i Fragment ho notato un comportamento che mi sembra STRANO:
nel file "fragment_fragment2.xml" il secondo TextView NON appare, PERCHE?

********** Fragment2.java **********
Codice (Java): [Seleziona]
package com.prove.provafragment18;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * A simple {@link Fragment} subclass.
 *
 */

public class Fragment2 extends Fragment {


    View rootView=null;

    public Fragment2() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        rootView=inflater.inflate(R.layout.fragment_fragment2, container, false);
        return(rootView);
    }

    public void scriviTesto(String s)
    {
        if (rootView==null) return;

        // Se invece di "R.id.textView1" scrivo "R.id.textView2" NON appare
        // nulla, e' come che "textView2" NON esistesse.
        TextView tv=(TextView) rootView.findViewById(R.id.textView1);
        tv.setText(s);
    }
}

********** fragment_fragment2.xml **********
Codice (XML): [Seleziona]
<LinearLayout 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"
   android:orientation="vertical"
   tools:context="com.prove.provafragment18.Fragment2">

    <TextView
       android:id="@+id/textView1"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:text="testo1" />

    <TextView
       android:id="@+id/textView2"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:text="testo2" />

</LinearLayout>

********** LogCat **********
Codice: [Seleziona]
12-13 13:26:25.433      945-945/com.prove.provafragment18 E/ResourceType﹕ Style contains key with bad entry: 0x01010479

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Errore relativo ai fragment
« Risposta #9 il: 13 Dicembre 2014, 22:31:22 CET »
0
Text view 1 e match parent match parent. Occupa tutto. Metti embrambe width match e height wrap