Autore Topic: Ritornare ad un Fragment da un Activity  (Letto 1361 volte)

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Ritornare ad un Fragment da un Activity
« il: 16 Marzo 2014, 00:01:14 CET »
0
Ciao, spero qualcuno di voi mi possa aiutare.

Sto iniziando lo sviluppo di un applicazione basata sui Fragment, sfruttando la navigazione a Tab.

Praticamente ho creato dei tab, dove in ognuno ci sono dei Fragment appunto.

Per il momento sto sviluppando il primo Tab, che restituisce un Fragment in formato lista.

Sul singolo elemento di questa lista richiama un Activity, che permette la modifica, o l'eliminazione dell'elemento.

Da questa lista è anche presente un bottone che permette la creazione di un nuovo elemento.

Concentriamoci un attimo sulla creazione di un nuovo elemento.

Se io creo il nuovo elemento, questo viene creato, accedo a un'activity da dentro il Fragment, e a creazione ultimata mi dovrebbe riportare al Fragment con la lista di elementi.

Questo avviene, però prima mi da un errore dell'applicazione.

Il logcat è il seguente:

Codice: [Seleziona]
03-15 18:28:40.360    1791-1791/com.example.tabstelegeatest E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.tabstelegeatest, PID: 1791
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.tabstelegeatest/com.example.tabstelegeatest.PlantsFragment}: java.lang.ClassCastException: com.example.tabstelegeatest.PlantsFragment cannot be cast to android.app.Activity
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2121)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassCastException: com.example.tabstelegeatest.PlantsFragment cannot be cast to android.app.Activity
            at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2112)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

Vi posto anche il codice del Fragment che richiama l'activity, e l'activity che dopo dovrebbe ritornare al Fragment:

PlantsFragment:

Codice: [Seleziona]
package com.example.tabstelegeatest;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import com.actionbarsherlock.app.SherlockListFragment;

import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
 
public class PlantsFragment extends SherlockListFragment {
 
    // Progress Dialog
    private ProgressDialog pDialog;
    Button btnNewPlant;
 
    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();
 
    ArrayList<HashMap<String, String>> plantsList;
 
    // url to get all plants list
    private static String url_all_plants = "http://192.168.0.8/test/telegea/get_all_plants.php";
 
    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PLANTS = "plants";
    private static final String TAG_PID = "id";
    private static final String TAG_NAME = "name";
 
    // plants JSONArray
    JSONArray plants = null;
 
   
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {   
        View mainView = inflater.inflate(R.layout.fragment_plants, container, false);
        return mainView;
    }
   
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        plantsList = new ArrayList<HashMap<String, String>>();

        btnNewPlant = (Button) view.findViewById(R.id.btn_add_plant);

        new LoadAllPlants().execute();
        ListView lv = getListView();
        lv.setOnItemClickListener(new OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {
                        // getting values from selected ListItem
                        String pid = ((TextView) view.findViewById(R.id.pid)).getText().toString();
               
                        // Starting new intent
                        Intent in = new Intent(getActivity(),EditPlantActivity.class);
                        // sending pid to next activity
                        in.putExtra(TAG_PID, pid);
               
                        // starting new activity and expecting some response back
                        startActivityForResult(in, 100);
                    }
                });

        // new plant click event
        btnNewPlant.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // Launching create new plant activity
                Intent i = new Intent(getActivity().getApplicationContext(), NewPlantActivity.class);
                startActivity(i);

            }
        });

    }

 
    // Response from Edit Plant Activity
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == 100) {
            Intent intent = getActivity().getIntent();
            startActivity(intent);
        }
 
    }
 
    /**
     * Background Async Task to Load all plant by making HTTP Request
     * */
    class LoadAllPlants extends AsyncTask<String, String, String> {
 
        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Loading plants. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }
 
        /**
         * getting All plants from url
         * */
        protected String doInBackground(String... args) {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            // getting JSON string from URL
            JSONObject json = jParser.makeHttpRequest(url_all_plants, "GET", params);
 
            // Check your log cat for JSON reponse
            Log.d("All Plants: ", json.toString());
 
            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);
 
                if (success == 1) {
                    // plants found
                    // Getting Array of Plants
                    plants = json.getJSONArray(TAG_PLANTS);
 
                    // looping through All Plants
                    for (int i = 0; i < plants.length(); i++) {
                        JSONObject c = plants.getJSONObject(i);
 
                        // Storing each json item in variable
                        String id = c.getString(TAG_PID);
                        String name = c.getString(TAG_NAME);
 
                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();
 
                        // adding each child node to HashMap key => value
                        map.put(TAG_PID, id);
                        map.put(TAG_NAME, name);
 
                        // adding HashList to ArrayList
                        plantsList.add(map);
                    }
                } else {
                    // no plants found
                    // Launch Add New plant Activity
                    Intent i = new Intent(getActivity(), NewPlantActivity.class);
                    // Closing all previous activities
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
            return null;
        }
 
        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all plants
            pDialog.dismiss();
            // updating UI from Background Thread
            getActivity().runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    ListAdapter adapter = new SimpleAdapter(getActivity(), plantsList,R.layout.list_item, new String[] { TAG_PID, TAG_NAME},
                            new int[] { R.id.pid, R.id.name });
                    // updating listview
                    setListAdapter(adapter);
                }
            });
 
        }
 
    }
}

NewPlantActivity:

Codice: [Seleziona]
package com.example.tabstelegeatest;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;
 
public class NewPlantActivity extends Activity {
 
    // Progress Dialog
    private ProgressDialog pDialog;
 
    JSONParser jsonParser = new JSONParser();
    EditText inputName;
    EditText inputUserId;
    EditText inputType;
 
    // url to create new plant
    private static String url_create_plant = "http://192.168.0.8/test/telegea/create_plant.php";
 
    // JSON Node names
    private static final String TAG_SUCCESS = "success";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_plant);
 
        // Edit Text
        inputName = (EditText) findViewById(R.id.inputName);
        inputUserId = (EditText) findViewById(R.id.inputUserId);
        inputType = (EditText) findViewById(R.id.inputType);
 
        // Create button
        Button btnCreatePlant = (Button) findViewById(R.id.btnCreatePlant);
 
        // button click event
        btnCreatePlant.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View view) {
                // creating new plant in background thread
                new CreateNewPlant().execute();
            }
        });
    }
 
    /**
     * Background Async Task to Create new plant
     * */
    class CreateNewPlant extends AsyncTask<String, String, String> {
 
        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(NewPlantActivity.this);
            pDialog.setMessage("Creating Plant..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
 
        /**
         * Creating plant
         * */
        protected String doInBackground(String... args) {
            String name = inputName.getText().toString();
            String user_id = inputUserId.getText().toString();
            String type = inputType.getText().toString();
 
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("name", name));
            params.add(new BasicNameValuePair("user_id", user_id));
            params.add(new BasicNameValuePair("type", type));
 
            // getting JSON Object
            // Note that create plant url accepts POST method
            JSONObject json = jsonParser.makeHttpRequest(url_create_plant,
                    "POST", params);
 
            // check log cat for response
            Log.d("Create Response", json.toString());
 
            // check for success tag
            try {
                int success = json.getInt(TAG_SUCCESS);
 
                if (success == 1) {
                    // successfully created plant
                    Intent i = new Intent(getApplicationContext(), PlantsFragment.class);
                    startActivity(i);
 
                    // closing this screen
                    finish();
                } else {
                    // failed to create plant
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
            return null;
        }
 
        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            pDialog.dismiss();
        }
 
    }
}

Spero che qualcuno di voi mi possa aiutare.

Problemi simili ce li ho anche nel salvataggio ed eliminazione, magari aprirò un altro topic dopo aver risolto questo.

Marco
« Ultima modifica: 16 Marzo 2014, 00:41:03 CET da marco_88 »

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Ritornare ad un Fragment da un Activity
« Risposta #1 il: 17 Marzo 2014, 09:40:27 CET »
+1
Ciao,
Il problema sarà sicuramente questo :
Codice (Java): [Seleziona]
Intent i = new Intent(getApplicationContext(), PlantsFragment.class);
startActivity(i);


stai cercando di far partire un'Activity passando la classe  PlantsFragment, che è un Fragment, non un'Activity.
Non puoi far partire un Fragment perché la loro esistenza è sempre legata a un'Activity.
Devi creare l'Intent passando la classe relativa all'Activity che contiene PlantsFragment.

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Ritornare ad un Fragment da un Activity
« Risposta #2 il: 17 Marzo 2014, 11:50:51 CET »
0
Ciao, ho in effetti risolto passando l'activity che comprende il fragment, però devo ancora verificare che funzioni bene.
Perchè se io aggiungo un activity adduser che viene richiamato dal fragment User e poi ritorno al main activity che contiene anche il fragment user che però è il secondo tab, poi ritorna sul primo tab o sul secondo? Ho solo questo dubbio, dovrò provare per capire se funziona o meno.

Marco

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Ritornare ad un Fragment da un Activity
« Risposta #3 il: 17 Marzo 2014, 12:21:04 CET »
+1
Ciao, ho in effetti risolto passando l'activity che comprende il fragment, però devo ancora verificare che funzioni bene.
Perchè se io aggiungo un activity adduser che viene richiamato dal fragment User e poi ritorno al main activity che contiene anche il fragment user che però è il secondo tab, poi ritorna sul primo tab o sul secondo? Ho solo questo dubbio, dovrò provare per capire se funziona o meno.

Marco

Dovrebbe rimanere sull'ultima Tab selezionata se l'Activity non è stata ricreata. Dal tuo codice mi pare che ricrei un'altra volta l'Activity che contiene le tabs.
Io solitamente faccio una cosa del genere : quando sono sull'Activity A che contiene le tabs e lancio una nuova Activity AddUserActivity ( B ), non richiamo finish() sull'Activity A. Quando l'utente ha finito di fare la sua operazione sull'Activity B richiamo finish() su quest'ultima. 

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Ritornare ad un Fragment da un Activity
« Risposta #4 il: 17 Marzo 2014, 12:29:50 CET »
0
Grazie, appena torno a casa proverò, perchè quest'activity ancora non l'ho creata e devo ancora farla.

Fra l'altro ho dei problemucci del tipo che quando passa fra un activity e un altra dentro dei fragment ancora non tutto funziona perfettamente, per esempio quando eseguo il salvataggio torna all'activity giusta, però non è aggiornata. Cioè se prima un impianto si chiamava DEMO, lo modifico in DEMOs e faccio salva, viene salvato, però nella lista degli impianti rimane DEMO, però quando esco e rientro si visualizza correttamente.

Poi magari ti spiego meglio e ti mostro il codice quando torno a casa.

Intanto grazie!

Marco

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Ritornare ad un Fragment da un Activity
« Risposta #5 il: 18 Marzo 2014, 13:17:48 CET »
0
Ho provato a creare il secondo tab relativo alla parte degli utenti.

In teoria è tutto ok, ma in pratica accade ciò che temevo.

Se dall'activity AddUser voglio tornare al fragment User non posso perchè sto cercando di tornare a un Fragment da un Activity giusto?

Quindi come per AddPlant ho fatto la stessa cosa con AddUser, quindi ho fatto in modo che tornasse direttamente all'activity che contiene i tab.

Solo che così facendo mi torna al tab principale, e non a quello selezionato per ultimo.

Quello che tu dici non l'ho capito gran che, AddUser ha il finish(); e sul MainActivity non mi sembra ci sia alcun finish, quindi l'Activity dovrebbe rimanere aperta, però non ho molto chiaro quello che hai detto.

Ti posto il codice e vediamo se veniamo a capo di questa cosa.

MainActivity:

Codice: [Seleziona]
package com.example.tabstelegeatest;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.view.ViewPager;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockFragmentActivity;

public class MainActivity extends SherlockFragmentActivity implements ActionBar.TabListener {

        private ViewPager viewPager;
        private TabsPagerAdapter mAdapter;
        private ActionBar actionBar;
        // Tab titles
        String[] tabs;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

        tabs = getResources().getStringArray(R.array.tabs_array);

                // Initilization
                viewPager = (ViewPager) findViewById(R.id.pager);
                actionBar = getSupportActionBar();
                mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
               
                viewPager.setAdapter(mAdapter);
                actionBar.setHomeButtonEnabled(false);
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
               
                // Adding Tabs
                for (String tab_name : tabs) {
                    actionBar.addTab(actionBar.newTab().setText(tab_name)
                            .setTabListener(this));
                }
               
                /**
                 * on swiping the viewpager make respective tab selected
                 * */
                viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
               
                    @Override
                    public void onPageSelected(int position) {
                        // on changing the page
                        // make respected tab selected
                        actionBar.setSelectedNavigationItem(position);
                    }
               
                    @Override
                    public void onPageScrolled(int arg0, float arg1, int arg2) {
                    }
               
                    @Override
                    public void onPageScrollStateChanged(int arg0) {
                    }
                });
        }
       
        @Override
        public void onTabReselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
        }
       
        @Override
        public void onTabSelected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
        // on tab selected
        // show respected fragment view
        viewPager.setCurrentItem(tab.getPosition());
        }
       
        @Override
        public void onTabUnselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
        }

    public void finish() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.exit);
        builder.setMessage(R.string.message_exit);
        builder.setCancelable(false);
        builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                quit();
            }
        });
        builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    }

    public void quit() {
        super.finish();
    };

}

Qui il finish è solo per chiudere l'applicazione con una dialog.

Nel caso potesse servire ti posto anche il codice che crea le varie tab:

TabsPagerAdapter:

Codice: [Seleziona]
package com.example.tabstelegeatest;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
 
public class TabsPagerAdapter extends FragmentPagerAdapter {
 
    public TabsPagerAdapter(FragmentManager fm) {
        super(fm);
    }
 
    @Override
    public Fragment getItem(int index) {
 
        switch (index) {
        case 0:
            // Plants fragment activity
            return new Plants();
        case 1:
            // Users fragment activity
            return new Users();
        case 2:
            // Groups fragment activity
            return new Groups();
        case 3:
            // Loggers fragment activity
            return new Loggers();
        case 4:
            // Profile fragment activity
            return new Profile();
        }
 
        return null;
    }
 
    @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return 5;
    }
 
}

Users:

Codice: [Seleziona]
package com.example.tabstelegeatest;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import com.actionbarsherlock.app.SherlockListFragment;

import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Users extends SherlockListFragment {

    // Progress Dialog
    private ProgressDialog pDialog;
    Button btnNewUser;

    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();

    ArrayList<HashMap<String, String>> usersList;

    // url to get all users list
    private static String url_all_users = "http://192.168.0.8/test/telegea/get_all_users.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_USERS = "users";
    private static final String TAG_PID = "id";
    private static final String TAG_LOGIN = "login";

    // users JSONArray
    JSONArray users = null;


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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        usersList = new ArrayList<HashMap<String, String>>();

        btnNewUser = (Button) view.findViewById(R.id.btn_add_user);

        new LoadAllUsers().execute();
        ListView lv = getListView();
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                // getting values from selected ListItem
                String pid = ((TextView) view.findViewById(R.id.pid)).getText().toString();

                // Starting new intent
                Intent in = new Intent(getActivity(),ViewUser.class);
                // sending pid to next activity
                in.putExtra(TAG_PID, pid);

                // starting new activity and expecting some response back
                startActivityForResult(in, 100);
            }
        });

        // new user click event
        btnNewUser.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // Launching create new user activity
                Intent i = new Intent(getActivity().getApplicationContext(), AddUser.class);
                startActivity(i);

            }
        });

    }


    // Response from Edit User Activity
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == 100) {
            Intent intent = getActivity().getIntent();
            startActivity(intent);
        }

    }

    /**
     * Background Async Task to Load all user by making HTTP Request
     * */
    class LoadAllUsers extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Loading users. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        /**
         * getting All users from url
         * */
        protected String doInBackground(String... args) {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            // getting JSON string from URL
            JSONObject json = jParser.makeHttpRequest(url_all_users, "GET", params);

            // Check your log cat for JSON reponse
            Log.d("All Users: ", json.toString());

            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // users found
                    // Getting Array of Users
                    users = json.getJSONArray(TAG_USERS);

                    // looping through All Users
                    for (int i = 0; i < users.length(); i++) {
                        JSONObject c = users.getJSONObject(i);

                        // Storing each json item in variable
                        String id = c.getString(TAG_PID);
                        String login = c.getString(TAG_LOGIN);

                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        map.put(TAG_PID, id);
                        map.put(TAG_LOGIN, login);

                        // adding HashList to ArrayList
                        usersList.add(map);
                    }
                } else {
                    // no users found
                    // Launch Add New user Activity
                    Intent i = new Intent(getActivity(), AddUser.class);
                    // Closing all previous activities
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all users
            pDialog.dismiss();
            // updating UI from Background Thread
            getActivity().runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    ListAdapter adapter = new SimpleAdapter(getActivity(), usersList,R.layout.list_users, new String[] { TAG_PID, TAG_LOGIN},
                            new int[] { R.id.pid, R.id.login });
                    // updating listview
                    setListAdapter(adapter);
                }
            });

        }

    }
}

Questo è il fragment che carica la lista Utenti, che è all'interno del MainActivity. Dovrebbe ricaricare questo fragment, ma quando richiamo il MainActivity carica quello principale.

Infine AddUser:

Codice: [Seleziona]
package com.example.tabstelegeatest;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class AddUser extends Activity {

    // Progress Dialog
    private ProgressDialog pDialog;

    JSONParser jsonParser = new JSONParser();
    EditText inputLogin;
    EditText inputPassword;
    EditText inputGroupId;

    // url to create new user
    private static String url_create_user = "http://192.168.0.8/test/telegea/create_user.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";

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

        // Edit Text
        inputLogin = (EditText) findViewById(R.id.inputLogin);
        inputPassword = (EditText) findViewById(R.id.inputPassword);
        inputGroupId = (EditText) findViewById(R.id.inputGroupId);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        // Create button
        Button btnCreateUser = (Button) findViewById(R.id.btnCreateUser);

        // button click event
        btnCreateUser.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // creating new user in background thread
                new CreateNewUser().execute();
            }
        });
    }

    /**
     * Background Async Task to Create new user
     * */
    class CreateNewUser extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(AddUser.this);
            pDialog.setMessage("Creating user..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Creating user
         * */
        protected String doInBackground(String... args) {
            runOnUiThread(new Runnable() {
                public void run() {

                    String login = inputLogin.getText().toString();
                    String password = inputPassword.getText().toString();
                    String group_id = inputGroupId.getText().toString();

                    if(login.equals("")) {
                        new AlertDialog.Builder(AddUser.this)
                                .setTitle(R.string.error)
                                .setMessage(R.string.dialog_login_empty)
                                .setNeutralButton("OK", null)
                                .show();
                    }

                    else if(password.equals("")) {
                        new AlertDialog.Builder(AddUser.this)
                                .setTitle(R.string.error)
                                .setMessage(R.string.dialog_password_empty)
                                .setNeutralButton("OK", null)
                                .show();
                    }

                    else if(group_id.equals("")) {
                        new AlertDialog.Builder(AddUser.this)
                                .setTitle(R.string.error)
                                .setMessage(R.string.dialog_group_empty)
                                .setNeutralButton("OK", null)
                                .show();
                    }

                    else {

                        // Building Parameters
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("login", login));
                        params.add(new BasicNameValuePair("password", password));
                        params.add(new BasicNameValuePair("group_id", group_id));

                        // getting JSON Object
                        // Note that create user url accepts POST method
                        JSONObject json = jsonParser.makeHttpRequest(url_create_user,
                                "POST", params);

                        // check log cat for response
                        Log.d("Create Response", json.toString());

                        // check for success tag
                        try {
                            int success = json.getInt(TAG_SUCCESS);

                            if (success == 1) {
                                // successfully created user
                                Intent i = new Intent(getApplicationContext(), MainActivity.class);
                                startActivity(i);

                                // closing this screen
                                finish();
                            } else {
                                // failed to create user
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            pDialog.dismiss();
        }

    }
}

Spero vivamente nel tuo aiuto, e scusami veramente dell'enorme disturbo che sicuramente starò dando con tutte queste richieste di aiuto!

Marco

Post unito: 18 Marzo 2014, 13:47:36 CET
EDIT:

Ho provato ad eliminare 2 righe che creavano un nuovo Intent, quindi riaprivano l'activity, e in questa maniera rimane nell'activity con il giusto Tab, però così genero il problema che ti ho scritto anche nel MSG PVT con il salvataggio:

In pratica senza riaprire l'Activity non si aggiorna la lista degli Utenti, e la stessa cosa accade quando aggiorno le informazioni di un impianto o di un utente.

Una soluzione per evitare di ricreare l'activity, ma fare in modo che il fragment al suo interno venga ricaricato?

Grazie

Marco
« Ultima modifica: 18 Marzo 2014, 13:47:46 CET da marco_88, Reason: Merged DoublePost »

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Ritornare ad un Fragment da un Activity
« Risposta #6 il: 18 Marzo 2014, 14:50:45 CET »
0
Io ti dicevo di non instanziare di nuovo la MainActivity, ma di tornare a quella precedente nello Stack facendo finish su AddUser.

Prova a togliere questo pezzo di codice
Codice (Java): [Seleziona]
 // successfully created user
                                Intent i = new Intent(getApplicationContext(), MainActivity.class);
                                startActivity(i);

prova a fare solo finish() sull'Activity AddUser, senza crearne una nuova.
In questo caso dovrebbe andare bene, se ho capito quale dovrebbe essere il flusso della tua applicazione.

In casi di flusso più complesso, esistono anche modi per avere una singola istanza di una data Actvity in un dato momento in tutta l'applicazione, indipendentemente da quante volte tu la faccia ripartire.
Non hai postato il manifest, ma immagino che tu non abbia specificato un attributo launchMode nell'activity MainActivity, quindi launchMode è "standard", il che significa che può essere istanziata tante volte.
Fammi sapere se così risolvi...altrimenti proviamo in un altro modo.

Post unito: 18 Marzo 2014, 14:52:45 CET
Ah scusa, ho appena letto il tuo edit, avevi già risolto! Adesso ti rispondo per il resto.
« Ultima modifica: 18 Marzo 2014, 14:52:45 CET da a_droid, Reason: Merged DoublePost »

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Ritornare ad un Fragment da un Activity
« Risposta #7 il: 18 Marzo 2014, 14:54:16 CET »
0
Si come scritto nell'ultimo post con dicitura EDIT così risolvo ma ho un altro problema, in questa maniera praticamente quando aggiungo l'utente torno al tab precedentemente selezionato, però non appare il nuovo utente creato, perchè non avendo ricreato l'activity, la seguente activity non viene aggiornata e rimane com'era prima.

La stessa cosa ce l'ho quando aggiorno un utente o impianto, che esce dall'activity, e quando ritorna dov'era in precedenza non ci sono le informazioni modificate.

Spero ci sia una maniera semplice di risolvere quest'inconveniente.

Grazie

Marco

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Ritornare ad un Fragment da un Activity
« Risposta #8 il: 18 Marzo 2014, 15:43:07 CET »
0
Non mi ero sono accorto che stai usando onStartActivityForResult per richiamare la seconda Activity, quindi come non detto, puoi rimettere quelle due linee di codice in cui crei l'Intent per MainIntent nella seconda Activity.

Adesso per riaprire la tab precedentemente selezionata quanto torni in MainActivity, devi salvare la tab selezionata in onSaveIntanceState e ripristinarla nell'OnCreate.

Puoi fare qualcosa del genere nell'Activity in cui ci sono le tabs, ma devi adattarlo perché tu non stai usando il TabHost .

Codice (Java): [Seleziona]
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Step 1: Inflate layout
        setContentView(R.layout.tabs_layout);
        // Step 2: Setup TabHost
        initialiseTabHost(savedInstanceState);
        if (savedInstanceState != null) {
            mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); //set the tab as per the saved state
        }
    }
 
    /** (non-Javadoc)
     * @see android.support.v4.app.FragmentActivity#onSaveInstanceState(android.os.Bundle)
     */

    protected void onSaveInstanceState(Bundle outState) {
        outState.putString("tab", mTabHost.getCurrentTabTag()); //save the tab selected
        super.onSaveInstanceState(outState);
    }

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Ritornare ad un Fragment da un Activity
« Risposta #9 il: 18 Marzo 2014, 16:00:33 CET »
0
Scusami ma non conosco minimamente il TabHost e quindi che differenze ci sono con quello che uso io. Come ripeto sto iniziando a studiare android adesso.

Però dimmi se sbaglio, mi può essere utile questa parte?

Codice: [Seleziona]
@Override
        public void onTabSelected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
        // on tab selected
        // show respected fragment view
        viewPager.setCurrentItem(tab.getPosition());
        }

Forse devo salvarmi questa informazione da qualche parte e poi recuperarla in un altra parte di codice?

Marco

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Ritornare ad un Fragment da un Activity
« Risposta #10 il: 18 Marzo 2014, 16:05:15 CET »
0
No...il TabHost era nell'esempio che ho trovato su Internet, ma non devi usarlo, è deprecato.
Aspetta, adesso cercherò di modificare il tuo codice per adattarlo.

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Ritornare ad un Fragment da un Activity
« Risposta #11 il: 18 Marzo 2014, 16:08:37 CET »
0
Guarda non so come ringraziarti, io ho tanta voglia di imparare questo linguaggio di programmazione sia perchè mi serve sia perchè mi sta piacendo, e il tuo aiuto per me è davvero prezioso, posso farti una donazione? ti stai rendendo veramente utile e prezioso per me e mi dispiace anche non poter ricambiare per l'aiuto che mi stai offrendo!

Grazie veramente!

Marco

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Ritornare ad un Fragment da un Activity
« Risposta #12 il: 18 Marzo 2014, 16:31:53 CET »
0
Tranquillo... i forum servono a questo! : ) Anche io trovo gente che mi aiuta a volte...

Qui salvi l'id nel Bundle che Android tiene automaticamente in memoria :

Codice (Java): [Seleziona]
/** (non-Javadoc)
                 * @see android.support.v4.app.FragmentActivity#onSaveInstanceState(android.os.Bundle)
                 */

                protected void onSaveInstanceState(Bundle outState) {
                    outState.putInt(KEY_TAB_INDEX, viewPager.getCurrentItem()); //save the tab selected
                    super.onSaveInstanceState(outState);
                }

E' qui invece che devi risettare la tab precedentemente salvata nel ViewPager.

Codice (Java): [Seleziona]
 if (savedInstanceState != null) {
                        viewPager.setCurrentItem(savedInstanceState.getInt(KEY_TAB_INDEX)); //set the tab as per the saved state
                }

Non ricordo se le istruzioni per il settaggio e inserimento degli elementi nel ViewPager siano quelli giusti, non posso provarlo.
In ogni caso la logica è questa, in caso basta fare una breve ricerca per sapere come utilizzare il ViewPager.

Ecco il codice intero :

Codice (Java): [Seleziona]
package com.example.training;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.view.ViewPager;

public class MainActivity extends SherlockFragmentActivity implements ActionBar.TabListener {

       
                private final String KEY_TAB_INDEX = "MainActivity.KEY_TAB_INDEX";
                               
        private ViewPager viewPager;
        private TabsPagerAdapter mAdapter;
        private ActionBar actionBar;
        // Tab titles
        String[] tabs;
       
        }
       
                /** (non-Javadoc)
                 * @see android.support.v4.app.FragmentActivity#onSaveInstanceState(android.os.Bundle)
                 */

                protected void onSaveInstanceState(Bundle outState) {
                    outState.putInt(KEY_TAB_INDEX, viewPager.getCurrentItem()); //save the tab selected
                    super.onSaveInstanceState(outState);
                }

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

               
                tabs = getResources().getStringArray(R.array.tabs_array);

                // Initilization
                viewPager = (ViewPager) findViewById(R.id.pager);
                actionBar = getSupportActionBar();
                mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
               
                viewPager.setAdapter(mAdapter);
                actionBar.setHomeButtonEnabled(false);
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
               
                // Adding Tabs
                for (String tab_name : tabs) {
                    actionBar.addTab(actionBar.newTab().setText(tab_name)
                            .setTabListener(this));
                }
               
                if (savedInstanceState != null) {
                        viewPager.setCurrentItem(savedInstanceState.getInt(KEY_TAB_INDEX)); //set the tab as per the saved state
                }
               
                /**
                 * on swiping the viewpager make respective tab selected
                 * */

                viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
               
                    @Override
                    public void onPageSelected(int position) {
                        // on changing the page
                        // make respected tab selected
                        actionBar.setSelectedNavigationItem(position);
                    }
               
                    @Override
                    public void onPageScrolled(int arg0, float arg1, int arg2) {
                    }
               
                    @Override
                    public void onPageScrollStateChanged(int arg0) {
                    }
                });
        }
       
        @Override
        public void onTabReselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
        }
       
        @Override
        public void onTabSelected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
        // on tab selected
        // show respected fragment view
        viewPager.setCurrentItem(tab.getPosition());
        }
       
        @Override
        public void onTabUnselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
        }

    public void finish() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.exit);
        builder.setMessage(R.string.message_exit);
        builder.setCancelable(false);
        builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                quit();
            }
        });
        builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    }

    public void quit() {
        super.finish();
    };

}

Fammi sapere se va, ciao

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Ritornare ad un Fragment da un Activity
« Risposta #13 il: 18 Marzo 2014, 16:47:33 CET »
0
Purtroppo non ha funzionato, ma mi sono accorto che qualcosa non torna, perchè praticamente mi ha aperto un activity sopra un altra. Cioè il fatto di aver creato un nuovo Intent fa in modo che quello precedente dove si trova nel giusto tab rimane aperto, e sopra ne apre un altro correttamente aggiornato ma sul tab sbagliato e le modifiche da te suggerite non hanno avuto effetto.

Marco
« Ultima modifica: 18 Marzo 2014, 17:36:23 CET da marco_88 »

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Ritornare ad un Fragment da un Activity
« Risposta #14 il: 20 Marzo 2014, 14:41:49 CET »
0
Alla fine ho risolto per il momento ricaricando la lista dentro un onResume.