2016-01-18 3 views
0

У меня есть фрагмент, которому необходимо передать более одного действия обратно в его действие. Например,Несколько интерфейсов в одном фрагменте

  1. При нажатии кнопки необходимо передать onClick обратно в Activity.

2. При совпадении имени пользователя и пароля логическое значение отправляется в Activity, уведомляя его о начале намерения.

Мой первый вопрос заключается в том, является ли это общим, когда фрагмент должен передать больше одного типа действий обратно в Activity? А во-вторых, как это решить? Является следующим хорошим способом сделать это ...

Я создал собственный класс, который расширяет фрагмент и включает в себя два необходимых интерфейса (один для передачи onClick обратно в Activity и One для передачи логического значения):

public class CustomInterfaceFragment extends Fragment { 

public OnClickedListener listener; 
public LogInInterface loggedInListener; 

static interface OnClickedListener{ 
    public void buttonClicked(View v); 
} 

static interface LogInInterface{ 
    public void userLoggedIn(boolean loggedIn); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    this.listener = (OnClickedListener)activity; 
    this.loggedInListener = (LogInInterface)activity; 
}} 

Затем я расширил этот пользовательский класс в своем фрагменте и использовал соответствующие методы там, где это необходимо. Это метод OnClick в фрагменте ...

@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.register_button:{ 
      listener.buttonClicked(v);//***Pass onClick Back to Activity 
      break; 
     } 
     case R.id.fragment_login_loginButton:{ 
      ParseUser.logInInBackground(userName.getText().toString(), password.getText().toString(), new LogInCallback() { 
       @Override 
       public void done(ParseUser user, ParseException e) { 
        if (user!=null){ 
         boolean verified = user.getBoolean("emailVerified"); 
         if(!verified){ 
          Toast.makeText(getActivity(),"Please Verify",Toast.LENGTH_LONG).show(); 
          progressDialog.dismiss(); 
          ParseUser.logOut(); 
         }else{ 
          progressDialog.dismiss(); 
          loggedInListener.userLoggedIn(true);//***Pass boolean Back to Activity 
         } 
        }else { 
         Toast.makeText(getActivity(),e.getMessage(),Toast.LENGTH_LONG).show(); 
         progressDialog.dismiss(); 
        } 

       } 
      }); 
     } 
     break; 
    } 
} 

Наконец я реализовал пользовательский класс фрагмента и его интерфейсы в моей деятельности с целью извлечения данных.

Является ли это разумным способом решения этой проблемы или я что-то упускаю? Приложение работает нормально. Я просто хочу знать, какая будет лучшая практика программирования. Спасибо.

ответ

1

все, что я могу сказать, что вы можете сбить эти два интерфейса к одному, как это ниже

public interface fragmentInteractions{ 
    public void OnClickedListener(View v); 
    public void userLoggedIn(boolean loggedIn); 
    .... 
    .... 

} 

и я не думаю, что интерфейс здесь должен быть статическим

+0

И просто реализовать это в классе фрагментов вместо создания отдельного пользовательского? –

0

Уточняя ответ Авинаша Джоши :

public interface CustomListener { 
      void onButtonClicked(); 
      void onLoginResult(boolean isUserLoggedIn); // You can pass User object via this method in case its required to do some operations 
    } 

    public class MainActivity extends Activity implements CustomListener { 


     @Override 
     public void onCreate(Bundle savedInstance) { 

      // Initialize UI elements 
      // Initialize Fragment 

     } 

     @Override 
     public void onButtonClicked() { 
      //Action to be performed on button click 
     } 

     @Override 
     public void onLoginResult(boolean isUserLoggedIn) { 
      if(isUserLoggedIn) { 
      //take user to dashboard or any other screen 
      //Usually with the help of SupportFragmentManager 

      } 
      else { 
      //Take user to signup screen with an optional toast message 
      //In case parameters like User name and password need not be entered by user again, you can access them as function parameters and pass them to signupFragment via bundle 
      } 
     } 
    } 

    public class LoginFragment extends Fragment { 

     CustomListener mCustomListener; 

     @Override 
     public void onAttach(Context context) { 
      super.onAttach(Context context); 
      try { 
       mCustomListner = (CustomListener) context; 
      } catch (ClassCastException e { 
       Log.e(TAG, "Activity must implement CustomListener") 
      } 

     } 

     //Rest of Fragment initialization code here 
    } 

Вот полный пример:

http://www.truiton.com/2015/12/android-activity-fragment-communication/

Смежные вопросы