2

У меня есть фрагмент в этом фрагменте, я пытаюсь вызвать Toast, когда пользователь вводит неправильный логин и пароль, но Toast не отображается, когда нажата кнопка входа в систему и лог выше, чем тост, но все же тост не отображаетсяToast Inside Fragment Не работает

This is my Fragment

Вот мой фрагмент

public class Login_Fragment extends Fragment { 

    EditText LoginUname,LoginPass; 
    ImageButton SignIn; 
    Context context; 
    public static final String TAG="Login Fragment"; 


    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view= inflater.inflate(R.layout.login_fragment,container,false); 
     LoginUname= (EditText) view.findViewById(R.id.Login_Box); 
     LoginPass= (EditText) view.findViewById(R.id.Pass_Box); 
     SignIn= (ImageButton) view.findViewById(R.id.LoginButton); 

     SignIn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       String Phone=LoginUname.getText().toString(); 
       String Password=LoginPass.getText().toString(); 

       new AsyncTask(){ 
        @Override 
        protected void onPostExecute(String result) { 
         super.onPostExecute(result); 
         Log.d("LOGIN FRAGMENT","Result: "+result); //GETTING RESULT FAIL HERE 

         if (result.equals("FAIL")){ 
          Log.d("LOGIN FRAGMENT","Result is FAIL"); //THIS LOG SHOWING IN LOGCAT BUT TOAST IS NOT VISIBLE 
          Toast.makeText(getActivity(), "Invalid Login And Password", Toast.LENGTH_LONG).show(); 

         } 
         else if (result.equals("SUCCESS")){ 
          Log.d("LOGIN FRAGMENT","Result is Success"); 

         } 

        } 
       }.execute(); 
       Log.d("LOGIN FRAGMENT","----LOGIN AND PASSWORD SENT"); 

      } 
     }); 
     Registration.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Registration_Fragment registrationFragment=new Registration_Fragment(); 
       FragmentManager fragmentManager=getFragmentManager(); 
       FragmentTransaction transaction=fragmentManager.beginTransaction(); 
       transaction.replace(R.id.FragmentLoginRegistration,registrationFragment); 
       transaction.commit(); 
      } 
     }); 

     return view; 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     this.context=context; 
    } 
} 

Вход

08-23 14:04:38.115 29053-29053/com.boysjoys.com.pro_working1 D/LOGIN FRAGMENT: Result: FAIL 
08-23 14:04:38.115 29053-29053/com.boysjoys.com.pro_working1 D/LOGIN FRAGMENT: Result is FAIL 

я уже пытался

Toast.makeText(getActivity(), "Invalid Login And Password", Toast.LENGTH_LONG).show(); 


Toast.makeText(getActivity().getApplicationContext(), "Invalid Login And Password", Toast.LENGTH_LONG).show(); 


Toast.makeText(Login_Fragment.this.getActivity(), "Invalid Login And Password", Toast.LENGTH_LONG).show(); 

и почти все метод я могу использовать, чтобы показать тост видимую и, наконец, я попытался runOnUiThread, но его все еще не показывает.

EDIT 1: Добавлено Войдите, чтобы показать, что я получаю ответ от server- «FAIL»

Edit 2: Я попробовал каждый ответ я получил, но мой Toast все еще не показывает up.So есть любой шанс, что мой манифест, макет блокирует Toast? если да, пожалуйста, дайте мне знать, поэтому я обновлю свой макет, стиль, манифест в своем вопросе

+2

Как я вижу ваш код, вы не инициализируете 'SignIn'' Button'. – Ironman

+1

добавьте свои журналы, чтобы мы могли отслеживать проблему. –

+0

Выполняет ли ваша задача Async результат как FAIL или SUCCESS? – Stallion

ответ

0

getActivity() вернет null, если он запущен до onAttach (Activity). Вместо этого, вы должны вызвать getActivity() непосредственно в своих методах onPreExecute и onPostExecute или получить ссылку на него в onAttach:

public void onAttach (Activity attachedActivity) { 
    activity = attachedActivity; 
} 
+0

Не работает, попробовал это, как вы можете видеть Обновленный код – androidXP

0

Добавить этот метод в прошлом или в приложении активности и вызов, где вы хотите его работу

public void showToast(@NonNull String msg) { 
    Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show(); 
} 
+0

Нет. с вопросом OP – Piyush

-1

Вы можете достичь Тост ниже кода

Toast.makeText(view.getContext(), "Invalid Login Or Password", Toast.LENGTH_LONG).show(); 
0

на самом деле ваш код работает хорошо для меня. Я жестко закодировал логин Fail в doInBackground, чтобы он заходил в блок блокировки входа onPostExecute(). Вот код

new AsyncTask(){ 
       @Override 
       protected Object doInBackground(Object[] params) { 
        return "FAIL"; // Hardcoded to make login fail 
       } 

       @Override 
      protected void onPostExecute(Object result) { 
       super.onPostExecute(result); 
       Log.d("LOGIN FRAGMENT","Result: "+result); 

       if (result.equals("FAIL")){ 
        Log.d("LOGIN FRAGMENT","Result is FAIL"); 
        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Log.d("LOGIN FRAGMENT","Result is FAIL 2"); 
          Toast.makeText(getActivity(), "Invalid Login Or Password toast", Toast.LENGTH_LONG).show(); 
         } 
        }); 

       } 
       else if (result.equals("SUCCESS")){ 
        Log.d("LOGIN FRAGMENT","Result is Success"); 

       } 

      } 
     }.execute(); 
+0

Как вы можете видеть обновленный вопрос, я также публикую скриншот, а также я отправляю logcat, но для меня он вообще не работает, я не знаю, что я делаю неправильно – androidXP

0

Вы должны назвать шоу Тост на UI тему, Так что просто попробовать, как это:

SignIn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      String Phone=LoginUname.getText().toString(); 
      String Password=LoginPass.getText().toString(); 

      new AsyncTask(){ 
       @Override 
       protected void onPostExecute(String result) { 
        super.onPostExecute(result); 
        Log.d("LOGIN FRAGMENT","Result: "+result); //GETTING RESULT FAIL HERE 

        if (result.equals("FAIL")){ 
         Log.d("LOGIN FRAGMENT","Result is FAIL"); //THIS LOG SHOWING IN LOGCAT BUT TOAST IS NOT VISIBLE 
         new Handler(Looper.getMainLooper()).post(new Runnable() { 
          @Override 
          public void run() { 
           Toast.makeText(getActivity(), "Invalid Login And Password", Toast.LENGTH_LONG).show(); 
          } 
         }); 

        } 
        else if (result.equals("SUCCESS")){ 
         Log.d("LOGIN FRAGMENT","Result is Success"); 

        } 

       } 
      }.execute(); 
      Log.d("LOGIN FRAGMENT","----LOGIN AND PASSWORD SENT"); 

     } 
    }); 
+0

Я уже пробовал это с помощью 'runOnuithread', но не повезло и также по вашему методу – androidXP

+0

@androidXP Я тестировал это в своей локальной демонстрации, это сработало. Итак, если вам хорошо показать весь код? – Cobain

+0

Несомненно, я попробую еще раз и вернусь к вам скоро – androidXP

0

Я рекомендовал вам принять AsyncTask вызов, как этот

public class Login_Fragment extends Fragment { 

EditText LoginUname,LoginPass; 
ImageButton SignIn; 
Context context; 
public static final String TAG="Login Fragment"; 


@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view= inflater.inflate(R.layout.login_fragment,container,false); 
    LoginUname= (EditText) view.findViewById(R.id.Login_Box); 
    LoginPass= (EditText) view.findViewById(R.id.Pass_Box); 
    SignIn= (ImageButton) view.findViewById(R.id.LoginButton); 
SignIn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      String Phone=LoginUname.getText().toString(); 
      String Password=LoginPass.getText().toString(); 

       new Asynctask(Phone,Password).execute(); 

     } 
    }); 

    Registration.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Registration_Fragment registrationFragment=new Registration_Fragment(); 
      FragmentManager fragmentManager=getFragmentManager(); 
      FragmentTransaction transaction=fragmentManager.beginTransaction(); 
       transaction.replace(R.id.FragmentLoginRegistration,registrationFragment); 
      transaction.commit(); 
     } 
    }); 

    return view; 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    this.context=context; 
} 




private class Asynctask extends AsyncTask<String, Integer, String> { 


String password,phone; 

     public Asynctask(String phone, String password) { 
      password=password; 
      phone=phone; 

     } 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected String doInBackground(String... params) 
     { 

     // you need to take doInbackground to return result 
      return "SUCCESS"; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 

      Log.d("LOGIN FRAGMENT","Result: "+result); 

      if (result.equals("FAIL")){ 
       Log.d("LOGIN FRAGMENT","Result is FAIL"); 
       getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Log.d("LOGIN FRAGMENT","Result is FAIL 2"); 
         Toast.makeText(getActivity(), "Invalid Login Or Password toast", Toast.LENGTH_LONG).show(); 
        } 
       }); 

      } 
      else if (result.equals("SUCCESS")){ 
       Log.d("LOGIN FRAGMENT","Result is Success"); 

      } 


     } 
    } 

} 
+0

Его отдельный класс, но я вызываю onPostexecute во фрагменте, потому что я хотел получить результат, и когда я получаю информацию о пользователе, поэтому мне нужно использовать его так – androidXP

+0

it'separte, но вы берете фрагмент .... над onattacth ... –

+0

, что код просто для того, чтобы проверить ответ ниже, я удаляю его уже извините за путаницу – androidXP