фрагменты, некоторые советы - PullRequest
0 голосов
/ 08 июня 2018

Я новичок в разработке для Android, и мне нужны некоторые советы от вас.Я создаю приложение и использую фрагменты, следуя документам Google для Android.

Сейчас приложение работает нормально, но у меня есть несколько вопросов по поводу "хорошего стиля кодирования".

Итак, я решил пока разделить активность 2 на 2 фрагмента, и я добавил фрагмент программно (тег XML не объявлен), и с помощью интерфейса и метода обратного вызова я могу вызвать другой фрагмент и передать объект.

Вот код, который поможет вам понять, что я имею в виду: Упражнение 2:

ЛЕГЕНДА: SegnalazioneFotoMappa des == фрагмент2 UserLog == фрагмент1

public class ActivitySegnalazione extends AppCompatActivity implements ObjectSender{
    private Segnalazione segnalazione= null;
    private FragmentManager manager;
    private FragmentTransaction transiction=null;
    private UserLog user=null;
    private DescrizioneFotoMappa des=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_segnalazione);

    }

    @Override
    protected void onStart()
    {
        super.onStart();
        segnalazione=new Segnalazione();
        user= new UserLog();
        user.setSegnalazione(segnalazione);
        manager=getFragmentManager();
        transiction=manager.beginTransaction();
        transiction.add(R.id.acsegn, user, "userfrag" );
        transiction.commit();
    }

    @Override
    public void sender(Segnalazione segnalazione1) {
        des= new DescrizioneFotoMappa(); //fragment2
        des.setSegnalazione(segnalazione1);
        FragmentTransaction transiction2= getFragmentManager().beginTransaction();
        transiction2.replace(R.id.acsegn, des).addToBackStack("frag1").commit();

    }
}

, и этоМетод onResume для фрагмента 1 ЛЕГЕНДА: obj == interface

@Override
     public void onResume()
     {
         super.onResume();
         text= (EditText) getActivity().findViewById(R.id.editText2);
         text2=(EditText) getActivity().findViewById(R.id.editText3);
         text3=(EditText) getActivity().findViewById(R.id.editText4);
         bottone1= (Button) getActivity().findViewById(R.id.button);
         obj=(ObjectSender) getActivity(); //Reference to activity

         bottone1.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 segnalazione.setNome(text2.getText().toString());
                 segnalazione.setCognome(text3.getText().toString());
                 obj.sender(segnalazione);
             }
         });
     }

Я знаю, что код является беспорядком, но правильна ли "логика фрагментов", которую я использую?Код работает, как я уже сказал.

Спасибо за ваши ответы!

1 Ответ

0 голосов
/ 08 июня 2018

Как я вижу, вы сохраняете ссылку на Activity в frag1 в переменной экземпляра obj, которая установлена ​​в onResume().

В вашем примере вы должны установитьПроверено на исключение) Ссылка на действие в методе фрагмента onAttach() и значение null в методе onDetach().Это обеспечивает слабую связь Фрагмента и Деятельности, которая его удерживает.

В вашем примере во фрагменте 1:

 @Override
 public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof ObjectSender) {
        obj = (ObjectSender) context; //Reference to activity
    } else {
        throw new RuntimeException(context.toString()
                    + " must implement ObjectSender");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    obj = null;
}

@Override
public void onResume(){
   super.onResume();
   text= (EditText) getActivity().findViewById(R.id.editText2);
   text2=(EditText) getActivity().findViewById(R.id.editText3);
   text3=(EditText) getActivity().findViewById(R.id.editText4);
   bottone1= (Button) getActivity().findViewById(R.id.button);

   bottone1.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           segnalazione.setNome(text2.getText().toString());
           segnalazione.setCognome(text3.getText().toString());
           obj.sender(segnalazione);
       }
   });
}

Кроме этого, ваша логика Фрагмента выглядит хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...