2017-11-29 24 views
-1

내 질문은 특히 이미 생성 된 토스트의 새로 고침과 관련되어 있습니다. 예를 들어토스트가 이미 표시되어있는 경우 토스트 위치가 업데이트되지 않습니다.

내가 생성 된 토스트가 :

Toast myToast; 

// ... 

protected void onCreate(Bundle savedInstanceState) { 
    // ... 

    myToast = Toast.makeText(getApplicationContext(), "Welcome", Toast.LENGTH_SHORT); 

을 그리고 난 두 가지 작업에 따라 다르게 업데이트 :

if (answerGiven != correctAnswer) { 
    myToast.setText("Wrong"); 


     View view = myToast.getView(); 
     TextView text = (TextView) view.findViewById(android.R.id.message); 
     text.setTextColor(Color.RED); 
     text.setTextSize(32); 

    myToast.setGravity(Gravity.CENTER, 0, 0); 
} else { 

     View view = myToast.getView(); 
     TextView text = (TextView) view.findViewById(android.R.id.message); 
     text.setTextColor(Color.BLACK); 
     text.setTextSize(32); 

    myToast.setText("+" + bonus); 

    myToast.setGravity(Gravity.TOP|Gravity.RIGHT, 20, 20); 
} 

myToast.show(); 

작업을 모두 잘 작동! 하지만 화면에서 빠르게 탭하고 두 번째 동작을 활성화하면 토스트가 사라지기 전에 메시지가 업데이트 되더라도 중력이 변경되지 않습니다.

예를 들어

: 내가 틀린 답을 선택하고 "잘못된"메시지가 화면의 중앙에 표시하는 경우 :

enter image description here

을하고 난 즉시 보너스 메시지가 나타납니다 쓰기 대답을 선택 화면 중간

enter image description here

(주 (내가 그것을 말할지라도은 setGravity(Gravity.TOP|Gravity.RIGHT, 20, 20);를 설정) : 난 후 "잘못된"메시지가 사라질 때까지 기다릴 경우 카릭 k 보너스 메시지가 예상대로 왼쪽 상단 모서리에 표시된 정답)

내가 원하는 것은 보너스 메시지를 항상 왼쪽 상단에 놓는 것입니다. 사용자가 클릭하여 금식하는 경우에도. 그래서 나는 묻습니다 : 새로운 메시지가 정확한 위치에 표시되도록 이전 토스트를 취소 할 수있는 방법이 있습니까? 또는 메시지를 올바른 위치에 표시 할 수 있도록 (예 : 활동을 새로 고치는 등)해야 할 일이 있습니다.

답변

2

나는 아래의 샘플 코드를 작성하고 그 당신이 직면하는 경우 working.Please 당신은 XML에있는 버튼을 만들어 그것을 테스트하고 알려 할 필요가

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

private Button btnAddData; 
private TextView tv; 
private EditText et; 
private boolean check; 
Toast myToast; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    myToast = Toast.makeText(getApplicationContext(), "Welcome", Toast.LENGTH_SHORT); 

    btnAddData = findViewById(R.id.btn_add_record); 

    btnAddData.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (check) { 
       if (myToast.getView().isShown()) 
        myToast.cancel(); 
       check = false; 
       myToast = Toast.makeText(getApplicationContext(), "Welcome", Toast.LENGTH_SHORT); 
       myToast.setGravity(Gravity.CENTER, 0, 0); 
       myToast.show(); 
      } else { 
       if (myToast.getView().isShown()) 
        myToast.cancel(); 
       check = true; 
       myToast = Toast.makeText(getApplicationContext(), "Welcome", Toast.LENGTH_SHORT); 
       myToast.setGravity(Gravity.TOP | Gravity.RIGHT, 20, 20); 
       myToast.show(); 
      } 
     } 
    }); 
} 

를 보라입니다 어떤 문제. 또한 당신은 당신의 필요에 따라 조정할 수 있습니다.

+0

예, 완벽하게 작동합니다! – JFreeman

+0

도움이 된 것을 기쁘게 생각합니다 :) 행복한 코딩 –

1

당신은

Toast.cancel()

그것을 보여주는 것 경우 view를 닫고, 또는 아직 표시되지 않을 경우 표시되지 않습니다 사용한다. 일반적으로 이것을 호출 할 필요는 없습니다. 일반적으로 view은 적절한 기간 후에 자체적으로 사라집니다.

if (myToast!= null) { 
    myToast.cancel(); 
} 
if (answerGiven != correctAnswer) { 

    myToast.setText("Wrong"); 

    myToast.setGravity(Gravity.CENTER, 0, 0); 
} else { 


    myToast.setText("+" + bonus); 

    myToast.setGravity(Gravity.TOP|Gravity.RIGHT, 20, 20); 
} 
+0

빠른 응답 주셔서 감사합니다, 불행히도 지금은 토스트가 전혀 표시되지 않습니다 ??? – JFreeman

+0

'Toast.show()'를 사용중인 @JFreeman – Prem

+0

'if' 문이 끝난 후 (편집 후) – JFreeman

2

당신은 새로운 토스트 메시지를 표시하기 전에 현재의 축배를 취소해야보십시오.

if (myToast != null) { 
    myToast.cancel(); 
} 

// your code ...