2015-01-10 5 views
1

사용자 입력 대화 상자를 사용하여 사용자 입력을 가져오고이 값은 getter 메서드를 사용하여 다른 활동으로 전달됩니다.사용자 지정 대화 상자에서 다른 활동으로 문자열 값 전달

하지만이 CSV 파일, shipName, analystName 등으로 문자열 값을 출력하는 방법에 값을 전달할 때 값은이 같은 파일로 빈 표시, " " 내가 대화 상자에 값을 입력하고 있지만.

디버그 메뉴의 표현식 창 shipNameanalystName에서 문자열 값을보고 문제점을 디버깅했으나 값은 식 창에서 절대 업데이트되지 않습니다.

입력이 전달되는 방법 i가 올바르지 않다는 사실을 모았습니다.

출력되는 값이 비어있는 이유를 아는 사람이 있습니까?

이 대화 클래스가 사용되는 :

public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.action_settings: 

      MyMessageDialog dialog =new MyMessageDialog(); 
      dialog.displayMessage(SearchResult.this, "Sample Info", "Required"); 



      // store/use the values here 
      shipName = dialog.getShipString(); 
      analystName = dialog.getScientistNameString(); 
      analystEmail = dialog.getScientistEmailString(); 
      sampleVolume = dialog.getVolumeString(); 
      sampleColour = dialog.getColourString(); 
      longitudeValue = String.valueOf(lng); 
      latitudeValue = String.valueOf(lat); 
      sampleMaterial = message; 

      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

답변

6

대화 상자가 비동기로 표시됩니다. 즉 을 호출 한 후 onOptionsItemSelected()의 코드 실행이 일시 중지되지 않으므로 getter가 해당 필드의 초기 값을 반환하므로 모든 경우에 null입니다. 해당 필드가 CustomListeneronClick() 메소드에 설정된 후에 Activity가 구현하는 인터페이스를 만들어 콜백을 수신하고 Activity 변수를 업데이트해야합니다.

대화 상자 클래스에서 인터페이스를 만듭니다. 필드 '값이 설정 한 후,

public AlertDialog displayMessage(Context context, String title, String message){ 
    this.context = context; 
    ... 
} 

그리고 onClick() 방법의 끝에 : 예를 들어 :

public class MyMessageDialog { 
    public interface DialogCallback { 
     public void onValuesSet(); 
    } 
    ... 
} 

은 컨텍스트에 대한 참조를 저장해야합니다

((DialogCallback) context).onValuesSet(); 

활동은 우리가 만든 인터페이스를 구현해야하며 대화 상자는 클래스 멤버 여야하며 필드는 인터페이스의 콜백 메소드에 설정됩니다.

public class SearchResult extends Activity 
    implements MyMessageDialog.DialogCallback { 
    ... 
    MyMessageDialog dialog; 

    @Override 
    public void onValuesSet() 
    { 
     shipName = dialog.getShipString(); 
     analystName = dialog.getScientistNameString(); 
     ... 
    } 
    ... 
} 
+0

M이 코드 예제를 구현할 수 있습니까? –

+1

@BrianJ 확실한 것. 그것은 나에게 1 초 걸릴 것이다. 나는 지금 전화하고있다. –

+0

@BrianJ 답변을 업데이트했습니다. 희망은 내가 다있어 ... –

1

귀하의 게터 돈 :

package ie.gmi.computing; 



import android.annotation.SuppressLint; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.renderscript.Sampler; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MyMessageDialog { 

    private Context context; 
    private EditText shipText, scientistNameText , scientistEmailText , volumeText , colourText ; 

    private String shipString, scientistNameString , scientistEmailString , volumeString , colourString ; 



    public AlertDialog displayMessage(Context context, String title, String message){ 
     AlertDialog.Builder builder = new AlertDialog.Builder(context); 
     builder.setTitle(title); 
     builder.setMessage(message); 
     LayoutInflater inflater = LayoutInflater.from(context); 
     final View v = inflater.inflate(R.layout.custom_view, null); 
     builder.setView(v); 
     shipText = (EditText)v.findViewById(R.id.shipNameEditText); 
     scientistNameText = (EditText)v.findViewById(R.id.scientistEditText); 
     scientistEmailText = (EditText)v.findViewById(R.id.emailEditText); 
     volumeText = (EditText)v.findViewById(R.id.volumeEditText); 
     colourText = (EditText)v.findViewById(R.id.colourEditText); 
     builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 



      } 
     }); 
     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 
     AlertDialog dialog= builder.create(); 
     dialog.show(); 
     Button tb = dialog.getButton(DialogInterface.BUTTON_POSITIVE); 
     tb.setOnClickListener(new CustomListener(dialog)); 

     return dialog; 
    } 


    //getter/setters to allow access to string values 
    //in SearchResult class 
    public EditText getShipText() { 
     return shipText; 
    } 



    public void setShipText(EditText shipText) { 
     this.shipText = shipText; 
    } 



    public EditText getScientistNameText() { 
     return scientistNameText; 
    } 



    public void setScientistNameText(EditText scientistNameText) { 
     this.scientistNameText = scientistNameText; 
    } 



    public EditText getScientistEmailText() { 
     return scientistEmailText; 
    } 


    public void setScientistEmailText(EditText scientistEmailText) { 
     this.scientistEmailText = scientistEmailText; 
    } 



    public String getShipString() { 
     return shipString; 
    } 


    public void setShipString(String shipString) { 
     this.shipString = shipString; 
    } 


    public String getScientistNameString() { 
     return scientistNameString; 
    } 


    public void setScientistNameString(String scientistNameString) { 
     this.scientistNameString = scientistNameString; 
    } 


    public String getScientistEmailString() { 
     return scientistEmailString; 
    } 


    public void setScientistEmailString(String scientistEmailString) { 
     this.scientistEmailString = scientistEmailString; 
    } 


    public String getVolumeString() { 
     return volumeString; 
    } 


    public void setVolumeString(String volumeString) { 
     this.volumeString = volumeString; 
    } 


    public String getColourString() { 
     return colourString; 
    } 


    public void setColourString(String colourString) { 
     this.colourString = colourString; 
    } 


    public EditText getVolumeText() { 
     return volumeText; 
    } 



    public void setVolumeText(EditText volumeText) { 
     this.volumeText = volumeText; 
    } 



    public EditText getColourText() { 
     return colourText; 
    } 



    public void setColourText(EditText colourText) { 
     this.colourText = colourText; 
    } 



    @SuppressLint("NewApi") 
    class CustomListener implements View.OnClickListener { 
     private final Dialog dialog; 
     public CustomListener(Dialog dialog) { 
      this.dialog = dialog; 
     } 
     @SuppressLint("NewApi") 
     @Override 
     public void onClick(View v) { 


      if(shipText.getText().toString().isEmpty() && !shipText.getText().toString().equals(null)){ 
       shipText.setError("The Field is required"); 

      }else if(scientistNameText.getText().toString().isEmpty() && !scientistNameText.getText().toString().equals(null)){ 
       scientistNameText.setError("The Field is required"); 
      }else if(scientistEmailText.getText().toString().isEmpty() && !scientistEmailText.getText().toString().equals(null)){ 
       scientistEmailText.setError("The Field is required"); 
      }else if(volumeText.getText().toString().isEmpty() && !volumeText.getText().toString().equals(null)){ 
       volumeText.setError("The Field is required"); 
      }else if(colourText.getText().toString().isEmpty() && !colourText.getText().toString().equals(null)){ 
       colourText.setError("The Field is required"); 
      }else{ 
       shipText.setError(null); 
       scientistNameText.setError(null); 
       scientistEmailText.setError(null); 
       volumeText.setError(null); 
       colourText.setError(null); 


       shipString = shipText.getText().toString(); 
       scientistNameString = scientistNameText.getText().toString(); 
       scientistEmailString = scientistEmailText.getText().toString(); 
       volumeString = volumeText.getText().toString(); 
       colourString = colourText.getText().toString(); 


       Toast.makeText(dialog.getContext(), "The Values you get from : " + 
         "\n Ship name value: " + shipText.getText().toString() + 
         "\n Scientist name value: " + scientistNameText.getText().toString() + 
         "\n email value: " + scientistEmailText.getText().toString() + 
         "\n sample volume value: " + volumeText.getText().toString() + 
         "\n sample colour value: " + colourText.getText().toString() , Toast.LENGTH_SHORT).show(); 

       dialog.dismiss(); 
      } 
     } 
    } 
} 

을 그리고 내의 SearchResult 클래스의 값을 검색하고있어 어떻게이며, 내가 설정 버튼을 선택하면 실제로 각 EditText보기에서 getText() 메서드를 호출하는 것 같습니다. 수정하십시오 (예 : scientistNameText.getText()).

추신 : 그렇습니다. 마이크 M은 실제로 비동기성에 대해이 문제에 기여할 수 있습니다. 그 주위의 또 다른 접근법은 각 EditText보기의 코드에 다음과 같은 코드를 추가하는 것입니다.

myEditTextView.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

      //Set the variable here that you call in your getter. Use `getText()` to get the string (e.g., myGetterVariable = myEditTextView.getText(). 


     } 
    } 
2

출력 값이 비어있는 이유를 아는 사람이 있습니까?

대화 상자 클래스에서 데이터를 가져 오는 모든 명령문이 메뉴 옵션 섹션의 dialog.displayMessage 이후에 실행되기 때문에.

MyMessageDialog에서 데이터를 가져 오는 방법 Ok 버튼을 클릭 하시겠습니까? 대신 문자열에 대한 모든 게터/setter 메소드의 리턴 타입을 변경 MyMessageDialog에서 EditText을 얻기의

1 ..

2Ok에 경고 가까이의 이벤트를 얻기를 위해 interface를 사용하여 이벤트 수신기 만들기 활동을 클릭하십시오. 당신은 이벤트 리스너를 만들 수 있습니다으로 :

Android Custom Event Listener

3. 전화 알림의 Ok 버튼 클릭 모든 세터 방법. 모든 setter 메서드 호출 이벤트 수신기 메서드를 호출 한 후 경고 이벤트가 끝난 후 Activity에서 이벤트를 실행합니다. :

 @Override 
     public void onClick(DialogInterface dialog, int which) { 
      setShipText(shipText.getText().toString()); 
      setScientistNameText(shipText.getText().toString()); 
      .... 
      //..close alert and call event listener method 
     } 
관련 문제