Autore Topic: Problema con Fragment  (Letto 364 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
Problema con Fragment
« il: 30 Settembre 2014, 23:54:32 CEST »
0
Il seguente programma FUNZIONA, e' un programma con due Fragment (in verticale, NO landscape), quando uno clicca
su uno dei 4 elementi in alto, in basso appare una breve scritta in rosso.

MainActivity.java
Codice (Java): [Seleziona]
package com.tizianobasile.multipanerecipes;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity implements TitlesFragment.OnItemSelectListener
{

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

        @Override
        public void onItemSelect(int index)
        {
                String description = Recipes.recipes[index].toString();
                DescriptionFragment descriptionFragment = (DescriptionFragment) getSupportFragmentManager().findFragmentById(R.id.descriptionFragment);
                if(descriptionFragment != null && descriptionFragment.isInLayout())
                {
                        descriptionFragment.setDescriptionIntoFragment(description);
                }
        }
}

TitlesFragment.java
Codice (Java): [Seleziona]
package com.tizianobasile.multipanerecipes;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class TitlesFragment extends ListFragment{

        private OnItemSelectListener itemSelectListener;
       
        //public interface used to communicate with activities
        public interface OnItemSelectListener
        {
                public void onItemSelect(int index);
        }
       
        //Check if the parent activity has implemented the public interface
        //if not, throw an exception
        @Override
        public void onAttach(Activity activity) {
                super.onAttach(activity);
                try
                {
                        itemSelectListener = (OnItemSelectListener) activity;
                }
                catch(ClassCastException e)
                {
                        throw new ClassCastException(activity.toString() + " must implement OnItemSelectListener");
                }
        }


        //launch the method described into the interface when the user click on an item
        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
                itemSelectListener.onItemSelect(position);
        }



        @SuppressLint("InlinedApi")
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
                int layout = 0;
                /*
                 * Pick a different layout for the list item based on the sdk version,
                 * as the simple_list_item_activated_1 is not compatible on devices
                 * running sdk < 11 and could throw a fatal exception
                 */

                if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB)
                {
                        layout = android.R.layout.simple_list_item_1;
                }
                else layout = android.R.layout.simple_list_item_activated_1;
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), layout, Recipes.titles);
                setListAdapter(adapter);
                getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
               
        }

}

DescriptionFragment.java
Codice (Java): [Seleziona]
package com.tizianobasile.multipanerecipes;

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;

public class DescriptionFragment extends Fragment
{

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.fragment_description, container, false);
                return view;
        }

        /*
         * Just an helper method to write the value received from the intent/action
         * into the TextView in the layout
         */

        public void setDescriptionIntoFragment(String s)
        {
                TextView tv = (TextView) getView().findViewById(R.id.description_textView);
                tv.setText(s);
        }
}

Recipes.java
Codice (Java): [Seleziona]
package com.tizianobasile.multipanerecipes;

/*
 * This is only a static recipe book made of static arrays
 * THIS IS THE WRONG WAY TO DO THESE THINGS, DON'T COPY ME!!! :-)
 */

public class Recipes {

        public static String[] titles =
        {
                        "Cooked eggs",
                        "Roasted Beef",
                        "Pane e Nutella",
                        "Pizza"
        };
       
        public static String[] recipes =
        {
                        "Take eggs and cook them",
                        "Take beef and roast it",
                        "Take bread and spread Nutella on it",
                        "Call pizzeria and ask for one"
        };
}

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

    <fragment
       android:id="@+id/titlesFragment"
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:layout_weight="0.80"
       class="com.tizianobasile.multipanerecipes.TitlesFragment"/>
   
    <fragment
       android:id="@+id/descriptionFragment"
       android:layout_width="wrap_content"
       android:layout_height="0dp"
       android:layout_weight="0.20"
       class="com.tizianobasile.multipanerecipes.DescriptionFragment" />
     
</LinearLayout>

fragment_description.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   android:padding="@dimen/activity_horizontal_margin">

    <TextView
       android:id="@+id/description_textView"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:textSize="20sp"
       android:textColor="#FFAA"
       android:text="testo" />

</LinearLayout>

=============================================================================

Ho provato a MODIFICARE il programma, invece dei quattro elementi in alto ci sono due bottoni, vorrei che quando
uno clicca sul primo bottone fosse come cliccare sul primo elemento, e similmente quando uno clicca sul secondo
bottone fosse come cliccare sul secondo elemento, INVECE quando clicco su un bottone il programma COLLASSA.

La modifica consiste nell'aver aggiunto "fragment1.xml" e modificato "TitlesFragment".

fragment1.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="horizontal"  
>

    <Button
       android:id="@+id/button1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:onClick="funcBottone1"
       android:text="Bottone 1" />

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

</LinearLayout>

TitlesFragment.java
Codice (Java): [Seleziona]
package com.tizianobasile.multipanerecipes;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;

public class TitlesFragment extends Fragment{

        private OnItemSelectListener itemSelectListener;
       
        //public interface used to communicate with activities
        public interface OnItemSelectListener
        {
                public void onItemSelect(int index);
        }
       
        //Check if the parent activity has implemented the public interface
        //if not, throw an exception
        @Override
        public void onAttach(Activity activity) {
                super.onAttach(activity);
                try
                {
                        itemSelectListener = (OnItemSelectListener) activity;
                }
                catch(ClassCastException e)
                {
                        throw new ClassCastException(activity.toString() + " must implement OnItemSelectListener");
                }
        }

        /*
        //launch the method described into the interface when the user click on an item
        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
                itemSelectListener.onItemSelect(position);
        }
        */

       
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
        {
                View view = inflater.inflate(R.layout.fragment1, container, false);
                return view;
        }
       
       
        // Quando clicco su "Bottone 1" o "Bottone 2" il programma collassa
        public void funcBottone1(View v)
        {
                // dovrebbe essere come selezionare il primo elemento della lista
                itemSelectListener.onItemSelect(0);
        }
        public void funcBottone2(View v)
        {
                // dovrebbe essere come selezionare il secondo elemento della lista
                itemSelectListener.onItemSelect(1);
        }                      
}

Qualcuno mi spiega perche' il programma collassa e come devo modificarlo per farlo funzionare?

iClaude

  • Visitatore
Re:Problema con Fragment
« Risposta #1 il: 01 Ottobre 2014, 10:35:09 CEST »
0
Ti do un consiglio x ricevere più facilmente risposte:
1) o crei un progetto completo che si possa scaricare velocemente, importare in Eclipse e quindi capire al volo dove sta l'errore
2) oppure posti il messaggio completo dell'errore e la riga che lo genera.

Altrimenti è come fare la caccia al tesoro!

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:Problema con Fragment
« Risposta #2 il: 01 Ottobre 2014, 13:38:39 CEST »
0
Ho provato a allegare i progetti per Eclipse ma non riesco a allegare cartelle, riesco a allegare solo file, quindi i due
i progetti li volevo inviare sotto forma di file ZIP, pero' NON riesco a allegarli, credo perche' entrambi sono
piu' grossi di 1 MB (sono circa 4 MB ognuno).

Quindi non posso inviare i progetti, riguardo i programmi c'e' da dire che il pannello "LogCat" e' completamente
vuoto. Quando provo a lanciare il progetto modificato quando a runtime clicco su un bottone mi appare la
seguente scritta:

Sorry!
The application MultiPaneRecipes (process com.tizianobasile.multipanerecipes) has stopped unexpectedly.
Please try again.