2014-09-01 3 views
0

У меня есть фрагмент с полями EditText для адреса пользователя. Я пытаюсь отправить их на свой веб-сервер через AsyncTask, но не понял, как получить значения. Он отлично работает без фрагментов. Я попытался удалить все ненужные коды. Благодарю.Получить значение EditText в AsyncTask внутри фрагмента

public class FragmentProfileMain extends Fragment implements OnClickListener { 

    EditText email2, email3, mail1, mail2, cityET, stateET, zipET; 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    view = inflater.inflate(R.layout.profile_fragment_main, container, 
      false); 

    email1 = (TextView) view.findViewById(R.id.profileEmail1); 
    email2 = (EditText) view.findViewById(R.id.profileEmail2); 
    email3 = (EditText) view.findViewById(R.id.profileEmail3); 
    mail1 = (EditText) view.findViewById(R.id.profileAddress1); 
    mail2 = (EditText) view.findViewById(R.id.profileAddress2); 
    cityET = (EditText) view.findViewById(R.id.profileCity); 
    stateET = (EditText) view.findViewById(R.id.profileState); 
    zipET = (EditText) view.findViewById(R.id.profileZip); 

return view; 
} 

class saveInfo extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... args) { 
     // TODO Auto-generated method stub 
     // Check for success tag 
     int success; 

     try { 
      // Building Parameters 
      String secondemail = ((EditText) this.email2).getText().toString(); 
      String thirdemail = ((EditText) this.email3).getText().toString(); 
      String secaddress = ((EditText) this.mail1).getText().toString(); 
      String secaddresstwo = ((EditText) this.mail2).getText().toString(); 
      String secCity = ((EditText) this.cityET).getText().toString(); 
      String secState = ((EditText) this.stateET).getText().toString(); 
      String secZip = ((EditText) this.zipET).getText().toString(); 

     } 
    } 
+0

Получаете ли вы какие-либо ошибки или просто нет значений? Рассматривали ли вы создание конструктора для своего класса 'saveInfo' и передачу в ссылках' EditText', которые вы создали в 'onCreateView' вашего фрагмента? Тогда у вас будут локализованные переменные в классе 'saveInfo'. – CodeMonkey

+0

Спасибо, что посмотрели. Я получаю сообщение об ошибке email2, email3 и т. Д. В моем разделе Строка secondemail = ((EditText) this.email2) .getText(). ToString(); Наведение ошибки на мой выбор - создать поле «email2» в типе saveInfo. Добавление поля private EditText email2; в моем классе saveInfo не помогает. Он не ссылается на EditText в фрагменте. – JeffK

+1

ОК. Вы ссылаетесь на 'this.email2', но' this' указывает на ваш 'saveInfo' класс, который не имеет понятия' email2'. Вам нужно передать ссылку на макет фрагмента, создав конструктор (это один из способов сделать это). – CodeMonkey

ответ

3

Вы должны передать значения EditText в AsyncTask качестве аргументов

Вы следует избегать передачи представлений в асинтезу, в случае уничтожения фрагмента или активности, пока асинтеза все еще работает. Это также делает асинктас более проверяемым, максимально развязывая логику.

public void startSaveInfo(){ 

    String firstEmail = email1.getText().toString(); 
    String secondEmail = email2.getText().toString(); 
    String thirdEmail = email3.getText().toString(); 
    String secaddress = mail1.getText().toString(); 
    String secaddresstwo = mail2.getText().toString(); 
    String secCity = cityEt.getText().toString(); 
    String secState = stateEt.getText().toString(); 
    String secZip = zipEt.getText().toString(); 

    new saveInfo().execute(secondemail,thirdEmail,secaddress,secaddresstwo,secCity,secState,secZip) 

} 

class saveInfo extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... args) { 
      // Building Parameters 
      String secondemail = args[0]; 
      String thirdemail = args[1]; 
      String secaddress = args[2]; 
      String secaddresstwo = args[3]; 
      String secCity = args[4]; 
      String secState = args[5]; 
      String secZip = args[6]; 

      //do your work 

    } 

} 
+0

Совершенство. Спасибо. – JeffK

0

При ссылке this.email2 и т.д. в вашем saveInfo классе this это ссылка на класс, который не имеет ни малейшего понятия о EditText объектов вы экземплярам в вашем фрагменте.

Одним из способов доступа к переменным экземпляра является создание конструктора saveInfo и отправка его объекта view из фрагмента.

В вашем фрагменте, или там, где вы вызываете вашу saveInfo задачу:

SaveInfo saveInfo = new SaveInfo(view) // 'saveInfo' should be capitalised 

В saveInfo:

... 
View view;  
public SaveInfo (View view) { 
    this.view = view; 
} 

@Override 
protected String doInBackground(String... args) { 
    // TODO Auto-generated method stub 
    // Check for success tag 
    int success; 

    try { 
     // Building Parameters 
     String secondemail = view.email2.getText().toString(); 
.... 
+0

только псевдокод, просто чтобы указать вам в правильном направлении! – CodeMonkey

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