Autore Topic: Consiglio sull'utilizzo dei fragment in modo corretto  (Letto 293 volte)

Offline abbobba

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi mi3
  • Sistema operativo:
    Xubuntu 15.04
Consiglio sull'utilizzo dei fragment in modo corretto
« il: 02 Ottobre 2015, 19:05:37 CEST »
0
Salve
ho da poco iniziato a utilizzare i fragment, ho ancora qualche dubbio su come devono essere divisi i compiti fra activity e fragment.
La cosa che ho capito è che il fragment si occupa dell'interfaccia e l'activity serve a "muoversi" tra i fragment e le altre activity giusto???

Io ho provato a fare una prova per esercitarmi ho nella prima activity una lista dove ogni elementi rappresenta la suddivisione della spesa in:
- spesa settimanale
- spesa mensile
- spesa straordinaria
implementata in questo modo:
Codice (Java): [Seleziona]
public class HomeActivity extends FragmentActivity implements CategoryListFragment.OnMyListFragmentItemClick {
    private static final String TAG = "HomeActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, getClass().getSimpleName() + ":entered onCreate()");
        setContentView(R.layout.ui_home);
    }

    @Override
    public void onClick(String item) {
        Log.i(TAG, getClass().getSimpleName() + ":entered onClick");
        Bundle arguments = new Bundle();
        arguments.putString(ShoppingListFragment.ARGUMENT_ITEM, item);
        View container = findViewById(R.id.detailContainer);

        if (container == null) {
            Intent intent = new Intent(this, ShoppingListActivity.class);
            intent.putExtras(arguments);
            startActivity(intent);
        } else {
            FrameLayout fl = (FrameLayout) findViewById(R.id.detailContainer);
            fl.setVisibility(View.VISIBLE);

            ShoppingListFragment shoppingListFragment = new ShoppingListFragment();
            shoppingListFragment.setArguments(arguments);

            FragmentManager fragmentManager = this.getSupportFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.detailContainer, shoppingListFragment)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                    .commit();
        }
    }
}

e questo è il fragment relativo ad esso:
Codice (Java): [Seleziona]
public class CategoryListFragment extends ListFragment {
    private static final String TAG = "CategoryListFragment";
    private String[] mCategoryArray = null;

    public static interface OnMyListFragmentItemClick {
        public void onClick(String item);
    }
    private OnMyListFragmentItemClick mActivityAttached;

    @Override
    public void onAttach(Activity activity) {      //!!!!!!!!!!!!da modificare
        super.onAttach(activity);

        if (activity instanceof OnMyListFragmentItemClick) {
            mActivityAttached = (OnMyListFragmentItemClick) activity;
        } else {
            mActivityAttached = new OnMyListFragmentItemClick() {
                @Override
                public void onClick(String item) {

                }
            };
        }
        Log.i(TAG, getClass().getSimpleName() + ":entered onAttach()");
        mCategoryArray = getResources().getStringArray(R.array.category_array);
    }

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

        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, mCategoryArray));
        Log.i(TAG, getClass().getSimpleName() + ":entered onActivityCreated()");
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Log.i(TAG, getClass().getSimpleName() + ":entered onListItemClick()");
        mActivityAttached.onClick(mCategoryArray[position]);
    }
}
Poi ho un'altra activity con il relativo fragment in cui inserisco ed edito i vari prodotti da inserire:
Activity:
Codice (Java): [Seleziona]
public class ShoppingListActivity extends FragmentActivity {
    private static final String TAG = "ShoppingActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, getClass().getSimpleName() + ":entered onCreate() dopo super");

        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            finish();
            return;
        } else {
            setContentView(R.layout.ui_shopping_list_portrait);
        }

        Bundle arguments = getIntent().getExtras();
        ShoppingListFragment shoppingListFragment = new ShoppingListFragment();
        shoppingListFragment.setArguments(arguments);
        FragmentManager fragmentManager = this.getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.containerPortrait, shoppingListFragment)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .commit();
        Log.i(TAG, getClass().getSimpleName() + ":entered onCreateView() dopo commit" );
    }
}
fragment:
Codice (Java): [Seleziona]
public class ShoppingListFragment extends Fragment {
    private static final String TAG = "MyDetailFragment";
    public static final String ARGUMENT_ITEM = "ITEM";
    private SharedPreferences savedItems;
    private TableLayout queryTableLayout;
    private EditText prodottiEditText;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.i(TAG, getClass().getSimpleName() + ":entered onAttach()");
    }

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


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.i(TAG, getClass().getSimpleName() + ":entered onCreateView()");
        return inflater.inflate(R.layout.ui_shopping_list, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Log.i(TAG, getClass().getSimpleName() + "1");

        Bundle arguments = getArguments();
        String file = arguments.getString(ARGUMENT_ITEM);
        savedItems = getActivity().getSharedPreferences(file, Context.MODE_PRIVATE);
        queryTableLayout = (TableLayout) view.findViewById(R.id.queryTabletLayout);
        prodottiEditText = (EditText) view.findViewById(R.id.prodottoEditText);

        TextView categoryText = (TextView) view.findViewById(R.id.itemSearchesTextView);
        categoryText.setText(file);

        Button addButton = (Button) view.findViewById(R.id.aggiungiButton);
        addButton.setOnClickListener(aggiungiButtonListener);
        Button clearTagsButton = (Button) view.findViewById(R.id.clearTagsButton);
        clearTagsButton.setOnClickListener(clearTagsButtonListener);
        refresh(null);
    }

    private void refresh(String newItem) {
        String[] items = savedItems.getAll().keySet().toArray(new String[0]);
        Arrays.sort(items, String.CASE_INSENSITIVE_ORDER);

        if (newItem != null) {
            creaProdottoGUI(newItem, Arrays.binarySearch(items, newItem));
        } else {
            for(int i = 0; i < items.length; ++i) {
                creaProdottoGUI(items[i], i);
            }
        }
    }

    //aggiunge i tag al file ed effettua un refresh dei bottoni
    private void creaProdotto(String item) {
        String originalItem = savedItems.getString(item, null);

        SharedPreferences.Editor preferenceEditor = savedItems.edit();
        preferenceEditor.putString(item, item);
        preferenceEditor.apply();

        if (originalItem == null) {
            refresh(item);
        }
    }

    private void creaProdottoGUI(String tag, int index) {
        LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View newItemView = inflater.inflate(R.layout.ui_new_item, null);

        TextView newTextView = (TextView) newItemView.findViewById(R.id.newTextView);
        newTextView.setText(tag);

        Button deleteButton = (Button) newItemView.findViewById(R.id.deleteButton);
        deleteButton.setOnClickListener(deleteButtonListener);

        queryTableLayout.addView(newItemView, index);
    }

    public View.OnClickListener deleteButtonListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            TableRow rowToDelete = (TableRow) v.getParent();
            TextView itemTextView = (TextView) rowToDelete.findViewById(R.id.newTextView);
            String item =  itemTextView.getText().toString();

            SharedPreferences.Editor prefereEditor = savedItems.edit();
            prefereEditor.remove(item);
            prefereEditor.apply();

            clearButtons();
            refresh(null);
        }
    };

    private void clearButtons() {
        queryTableLayout.removeAllViews();
    }

    public View.OnClickListener aggiungiButtonListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (prodottiEditText.getText().length() > 0 ) {
                creaProdotto(prodottiEditText.getText().toString());
                prodottiEditText.setText("");

                ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(prodottiEditText.getWindowToken(), 0);
            } else {
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                builder.setTitle(R.string.missingTitle);
                builder.setPositiveButton(R.string.OK, null);
                builder.setMessage(R.string.missingMessage);
                AlertDialog errorDialog = builder.create();
                errorDialog.show();
            }
        }
    };

    public View.OnClickListener clearTagsButtonListener = new View.OnClickListener() {     //cancella tutto ciò che è stato salvato collegato al pulsate CLEAR_TAGS
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle(R.string.confirmTitle);
            builder.setPositiveButton(R.string.erase, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int button) {
                            clearButtons();
                            SharedPreferences.Editor preferenceEditor = savedItems.edit();
                            preferenceEditor.clear();
                            preferenceEditor.apply();
                        }
                    }
            );
            builder.setCancelable(true);
            builder.setNegativeButton(R.string.cancel, null);
            builder.setMessage(R.string.confirmMessage);
            AlertDialog confirmDialog = builder.create();
            builder.show();
        }
    };



}



Il tutto sembra funzionare.
Secondo voi l'ultimo fragment l'avrei dovuto fare in maniera diversa????
Tipo avrei dovuto inserire l'interfaccia come nel primo fragment?

Ps
Ringrazio MarcoDuff e bradipao per i tutorial sui fragment