2016-08-07 1 views
0

토스트 메시지가 표시되지 않거나 표시 할 메시지가 전송하려는 메시지와 다른 경우에만 내 토스트 메시지가 사용자에게 표시됩니다. . 메시지가 사용자에게 표시되는 것과 동일한 경우 메시지가 통과하지 못하도록합니다 (무의미하기 때문에).축배 메시지가 기존 토스트와 다른 경우에만 표시

이 목표를 달성하기 위해 나는 축사를 보여줄 방법이 없다면 this 게시물을 보았습니다.

두 요구 사항을 모두 충족하도록 코드를 수정했습니다.

private Toast toast; 

public void showAToast (String st, boolean isLong){ 
    try{ 
     toast.getView().isShown(); 
     String text = ((TextView)((LinearLayout)toast.getView()).getChildAt(0)).getText().toString(); 
     if(!text.equalsIgnoreCase(st)){ 
      //New message, show it after 
      if(isLong){ 
       toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_LONG); 
      } else { 
       toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_SHORT); 
      } 
      toast.show(); 
     } 
    } catch (Exception e) { 
     //New message 
     if(isLong){ 
      toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_LONG); 
     } else { 
      toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_SHORT); 
     } 
     toast.show(); 
    } 
} 

마지막 토스트 메시지가 통과하려는 메시지와 동일한 경우 어떤 메시지도 통과하지 않습니다.

정확하게 발생하는 이유는 확실치 않지만 문제의 원인을 파악하는 데 디버깅 메시지를 넣습니다.

토스트 메시지가 앱의 수명 동안 전송 된 경우 toast.getView(). isShown()은 예외를 throw하지 않습니다 (토스트가 표시되지 않음을 의미한다고 가정).

제 질문은 어떻게 해결할 수 있습니까? 확실히 원하는 기능을 구현할 수있는 방법이 있어야합니다.

+0

토스트 한 가장 최근의 문자열을 추적 할 수 있습니까? 그럼 그냥 equals()와 문자열 비교를 할 수 있습니다. –

+0

코드 - 견습생 요점을 놓치고 있습니다. 문제는 문자열이 잘못 비교되는 것이 아니라 토스트가 응용 프로그램 수명주기의 어느 시점에서든 전송 된 경우 toast.isShown() 메서드가 진행되는 것입니다. 즉, 화면에 토스트가 없다고해도 catch 블록 코드 대신 try 블록 코드를 계속 실행합니다 (예를 들어 가정합니다). 원하는 효과를 얻기 위해이 문제를 해결할 수있는 방법을 묻습니다. – NuffsaidM8

+0

OIC ... 네, 전 질문을 완전히 오해 했습니다만, 당신이 생각한 이유가 아니라 ... 나쁘다. –

답변

0

나는 이것을 stackoverflow에서 전에 봤지만, 내가 좋아할만큼 깨끗하지는 않다. 우리는 두 번의 건배에서 번갈아 토스트 방식을 구현했습니다. 먼저 우리는 한 OnCreate 이전에 활동 토스트를 정의

Toast toast0; 
    Toast toast1; 
    private static boolean lastToast0 = true; 
    In the OnCreate: 

    toast0 = new Toast(getApplicationContext()); 
    toast0.cancel(); 
    toast1 = new Toast(getApplicationContext()); 
    toast1.cancel(); 
    //And finally, when I need to display the toast and cancel the prior toast at the same time I use something similar to: 

      if (lastToast0) { 
       toast0.cancel(); 
       toast1.setDuration(Toast.LENGTH_LONG); 
       toast1.setText("new message"); 
       toast1.show(); 
       lastToast0 = false; 
      } else { 
       toast1.cancel(); 
       toast0.setDuration(Toast.LENGTH_LONG); 
       toast0.setText("new message"); 
       toast0.show(); 
       lastToast0 = true; 
      } 
    // If you need to just cancel an existing toast (before it times out) use: 

       toast0.cancel(); 
       toast1.cancel(); 

견적

0

당신은 메시지를 표시하기 위해 동일한 Toast 인스턴스를 사용할 수 있습니다. 메시지가 동일하면 토스트는 두 번 표시되지 않으며 그렇지 않으면 텍스트가 최신 것으로 간단하게 변경됩니다.

Toast mToast; 

public void showToast(CharSequence message, int during){ 
    if (mToast == null) { 
     mToast = Toast.makeText(getApplicationContext(), message, during); 
    } else { 
     mToast.setText(message); 
    } 
    mToast.show(); 
} 

- ↓ --- ↓ ---- ↓ --- update-- ↓ ---- ↓ --- ↓ - 그것에 대해 ↓

미안 위의 포인트를 그리워 .

보기가 WindownManager.So에 추가되었으므로 뷰 상태를 얻을 수 없다는 Toast의 소스를 읽었습니다. Toast가 표시되는지 여부를 가리키는 방법을 찾을 수 없습니다.

그러나 토스트 사용 서비스는 위 애플리케이션에 표시된 축배를 좋아할 수 있습니다. 더 쉬울 수도 있습니다.

+0

이렇게하면 동일한 메시지가 두 번 연속으로 거부됩니다. 그렇습니까? 그것은 현재의 메서드가 이미 가지고있는 기능입니다. 원하는 것은 아닙니다. 메시지가 이미 화면에 표시되어있는 경우에만 반복되는 메시지를 전달하고 싶습니다.화면에 메시지가 없으면 메시지를 보내야합니다. – NuffsaidM8

+0

네, 맞습니다. 나는 대답을 업데이트 할 것이다. – vcokey

관련 문제