2016-09-16 4 views
0

Я хочу назвать метод класса Activity нормальным публичным классом. но он столкнулся с NullPointerException.Вызов метода виджета Android класса Activity из другого класса?

Мои Activty (Lv.class)

public class Lv extends Activity { 
     public static EditText et1; 
    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.listandimage); 
      et1 = (EditText) findViewById(R.id.editText1); 

Мой Открытый класс (Data.class)

 public class Data {    
      public String c = ""; 
      public String d = ""; 
      private static Socket soc; 

      public Data(String var1, String var2) { 
       this.c = var1.toLowerCase().trim(); 
       this.d = var2; 
      } 

    public final void start() { 

      try { 
       soc = new Socket(address, port); 
       os = soc.getOutputStream(); 
       is = new DataInputStream(soc.getInputStream()); 
      } catch (Exception var5) { 
      } 
    } 

     public void processdata(String rcvdata){ 
String txttype = rcvdata; 
     if (txttype.equals("\003")) { 
         String rname="my man"; 
         Lv.et1.setText(rname); 
    } 

MainActivity.class

button1.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     new RTask().execute(); 
    } 
}); 
class RTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... Void) { 
     try { 
      mee = new Data(editText1.getText().toString(), editText2 
        .getText().toString()); 
      mee.start(); 
     } catch (Exception e) { 
     } 
     return null; 
    } 

Data.class - это открытый класс, который передает данные, полученные из сокета. Да, имя макета, имя контента в порядке, когда я использую это от activity button onclick, он работает. Так или иначе, каждая команда деятельности класса

(например Gettext, кнопка на мыши, Calling адаптер извещать [сделал их public static также]) через этот общественный класс останется NullPointerException.

, пожалуйста, помогите мне разобраться в этой проблеме.

+0

Не могли бы вы предоставить больше кода? Например, если ваш класс Data инициализирован? Поскольку ваша переменная et1 является статической, возможно, что ваш экземпляр класса данных просто обращается к этой переменной до ее инициализации. Вы не должны использовать статические ссылки на свои представления - чтобы предотвратить утечку памяти. Вы должны ритовать вызов некоторого метода в своей деятельности, который будет устанавливать текст. Я думаю, ваши данные о соединении сокетов поставляются в рабочий поток, но метод 'setText()' должен вызываться в UI-Thread (см. Https://developer.android.com/reference/android/app/Activity.html#runOnUiThread (java.lang.Runnable)) – convexHull

+0

** Я предполагаю, что данные вашего подключения к сокету поставляются на рабочий поток, но метод setText() следует вызывать в UI-Thread ** Да, это соединение сокетов работает в потоке из MainActivity.class, где 'Data .class' - это класс сокетов для вызова сокета, а также не UI-поток. :(@convexHull –

+0

так как я называю метод потоков пользовательского интерфейса из класса неактивности, который проходит через асинтекс MainActivity.class? @convexHull –

ответ

0
  1. В вашем случае вы не должны установить EditText в качестве статического.
  2. Пройдите этот EditText в класс данных. Таким образом, вы можете вызвать его внутри класса Data.

    class Data { 
        //make it field 
        private EditText editText; 
        //your constructor of Data class 
        Data (EditText editText) { 
        this.editText = editText; 
        } 
        //now you can use editText like you are in Activity 
        private myMethod() { 
        editText.setText("every String you want to see here"); 
        } 
    } 
    

Теперь при создании данных из деятельности просто передать EditText

Data data = new Data(editText); 

Точно так же в вам нужно пройти Activity.

Если вам нужно изменить более одного EditText внутри вашего класса Data, то его лучше передать в него активность. Затем создайте несколько общедоступных методов для изменения значений представлений.

Прежде всего, вы должны знать, что статическая переменная связана с классом, а не объектом. Так что наверняка его null для вас в вашем случае, потому что метод onCreate, где вы инициализируете EditText, не является статическим.

+0

вы можете дайте пример, как я передаю 'EditText или Activity' через мой' Data.class'? @DEADMC –

+0

@srabonshahadat, смотрю обновленное сообщение – DEADMC

+0

th anks для вашего ответа, но есть некоторая путаница, 'EditText' уже создан на' Lv (Activity.class) ', В процессе приема данных, когда мой Data.class получает определенные данные, которые я хочу, я хочу изменить' EditText 'значение методом' .setText' из 'Data.class'. @DEADMC –

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