Autore Topic: Dialog in Fragmnet  (Letto 375 volte)

Offline Tiru

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows 10
Dialog in Fragmnet
« il: 29 Giugno 2017, 15:58:18 CEST »
0
Salve, ho un problema relativo alla creazione di un dialog in un fragment:

Fragment che chiama un metodo nell 'activity sotto essa per azionare un dialog

Codice (Java): [Seleziona]
@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.profilo_fragment,container,false);

        nome = (EditText) v.findViewById(R.id.nameProfilo);
        cognome = (EditText) v.findViewById(R.id.surnameProfilo);
        username= (EditText) v.findViewById(R.id.usernameProfilo);
        pwd= (Button) v.findViewById(R.id.pwdProfilo);
        phone = (EditText) v.findViewById(R.id.phoneProfilo);
        save = (Button) v.findViewById(R.id.saveProfilo);
        usernameData = getArguments().getString("Username");
        searchData();

        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkInfo();
            }
        });

        return v;
    }

    private void searchData(){
        CrossVariables.openDataBase(getContext());
        try {
            String aSQL = "SELECT * FROM Users where Username= '" + usernameData +"'";
            Cursor aCursor = CrossVariables.GLOBAL_DBH.readData(aSQL);

            if (aCursor != null) {
                while (aCursor.moveToNext()) {
                    codice=aCursor.getString(1);
                    username.setText(usernameData);
                    nome.setText(aCursor.getString(4));
                    cognome.setText(aCursor.getString(5));
                    phone.setText(aCursor.getString(6));
                }
            }

            if (!aCursor.isClosed()) {
                aCursor.close();
            }
        }
        catch (Exception _Ex) {
            Log.v("CarFurD", "caricaAutoCompleteArt", _Ex);
        }
    }

    private void checkInfo(){
        boolean salva=true;
        if(nome.getText().toString().length()>=50){
            salva=false;
        }
        if(cognome.getText().toString().length()>=50){
            salva=false;
        }
        if(username.getText().toString().length()>=50){
            salva=false;
        }
        if(phone.getText().toString().length()>=50){
            salva=false;
        }
        if(!salva){
            //todo alert ok;

            return;
        }
        writeDB();
    }

    private void writeDB(){
        String dati="Username= '"+username.getText().toString()+"', Nome= '"+nome.getText().toString()+"', Cognome='"+cognome.getText().toString()+"', Phone='"+phone.getText().toString()+"' where Codice='"+codice+"'";
        String insertDati = "UPDATE Users SET  "+dati;
        boolean esito = CrossVariables.GLOBAL_DBH.writeData(insertDati);
        new CookBook().writeDB();
    }

Activity
Codice (Java): [Seleziona]
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cook_book);


        final Bundle datipassati = getIntent().getExtras();
        String username = datipassati.getString("Username");

        navigationbar = BottomBar.attach(this, savedInstanceState);
        navigationbar.setItemsFromMenu(R.menu.bottom_bar, new OnMenuTabClickListener() {
            @Override
            public void onMenuTabSelected(@IdRes int menuItemId) {
                switch (menuItemId) {
                    case R.id.home:
                        HomeFragment homefragment = new HomeFragment();
                        homefragment.setArguments(datipassati);
                        getSupportFragmentManager().beginTransaction().replace(R.id.frame, homefragment).commit();
                        return;
                    case R.id.world:
                        WorldFragment worldfragment = new WorldFragment();
                        worldfragment.setArguments(datipassati);
                        getSupportFragmentManager().beginTransaction().replace(R.id.frame, worldfragment).commit();
                        return;
                    case R.id.ricette:
                        RicetteFragment ricetteFragment = new RicetteFragment();
                        ricetteFragment.setArguments(datipassati);
                        getSupportFragmentManager().beginTransaction().replace(R.id.frame, ricetteFragment).commit();
                        return;
                    case R.id.profilo:
                        ProfiloFragment friendsfragment = new ProfiloFragment();
                        friendsfragment.setArguments(datipassati);
                        getSupportFragmentManager().beginTransaction().replace(R.id.frame, friendsfragment).commit();
                        return;
                }
            }

            @Override
            public void onMenuTabReSelected(@IdRes int menuItemId) {

            }
        });

    }


    public void writeDB(){
        wCallReference = 1;
        wCallAction = CrossVariables.ACTION_SELECT;
        wCallQuery = "SELECT * FROM Users";
        wDialogID = PROGRESS_DIALOG_COMM;
        showDialog(wDialogID);
    }

    public void resumeFromDBOperation(int aReference) {

    }

    public String[][] getResponse() {
        return wResponse;
    }

    public int getSyncResponse() {
        return wSyncResponse;
    }

    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case PROGRESS_DIALOG_COMM:
                wPDialog = new ProgressDialog(getApplication().getApplicationContext());
                wPDialog.setMessage("Comunicazione con la sede, attendere...");
                wPDialog.setCancelable(false);
                return wPDialog;
            default:
                return null;
        }
    }

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        final Handler aHandler = new Handler() {
            public void handleMessage(Message msg) {
                switch (wDialogID) {
                    case PROGRESS_DIALOG_COMM:
                        wResponse = composeArray(msg.getData());
                        dismissDialog(PROGRESS_DIALOG_COMM);
                        resumeFromDBOperation(msg.getData().getInt("Reference"));
                        break;
                }
            }
        };
        switch (id) {
            case PROGRESS_DIALOG_COMM:
                wThreadComm = new Async(aHandler, wCallReference, wCallAction, wCallQuery, null);
                wThreadComm.start();
                break;
        }

        // Define the Handler that receives messages from the thread and update the
        // progress
    }


Quando arriva al metodo OnCreateDialog si blocca a:

                wPDialog = new ProgressDialog(getApplication().getApplicationContext());

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Dialog in Fragmnet
« Risposta #1 il: 30 Giugno 2017, 09:38:47 CEST »
0
Dal codice che hai postato ed in base alla tua descrizione non è chiaro come e chi invochi l'apertura del dialog.

E non hai postato il log dell'errore.

Da quello che desumo, la classe Activity si chiama CookBook e stai invocando l'apertura del dialog con

Codice (Java): [Seleziona]
new CookBook().writeDB();
E' una cosa terribile.

Stai creando un'istanza di activity completamente scollegata dalla gestione delle stesse, e non è una cosa buona.

Dovresti, invece, mantenere nel fragment un riferimento all'activity che l'ha creato, ed invocare i metodi usando quell'istanza.

Nel fragment:
Codice (Java): [Seleziona]
    private CookBook mActivity;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        try {
            mActivity = (CookBook) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " deve essere un'istanza di CookBook");
        }
    }

Poi invece di new CookBook().writeDB();:

Codice (Java): [Seleziona]
mActivity.writeDB();
Non è detto che questo risolva, ma sicuramente è una modifica da fare (sempre che, come premesso, la classe activity di cui stiamo parlando è CookBook)

P.S.: Per questioni di riusabilità ed isolamento, è ancora meglio se l'activity implementa un'interfaccia dichiarata nel fragment come descritto qui: https://developer.android.com/training/basics/fragments/communicating.html
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Tiru

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows 10
Re:Dialog in Fragmnet
« Risposta #2 il: 30 Giugno 2017, 14:23:32 CEST »
0
Grazie per la dritta ;-) ora funziona tutto!