2016-09-16 8 views
0

私は、Activity Classのメソッドを通常のpublicクラスに呼び出す必要があります。それに直面したNullPointerException別のクラスの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からそれを使用すると、はい、レイアウト名、コンテンツ名はokです、それは動作します。このパブリッククラス経由 どういうわけか、アクティビティクラスのすべてのコマンド

(アダプタが通知呼び出しクリックで例えばgettextを、ボタンは、[また、それらpublic static製]) はNullPointerExceptionがままになります。

この問題を解決するのを手伝ってください。あなたは静的としてEditText設定はずのあなたの場合は

+0

もっとコードを提供できますか?あなたのDataクラスが初期化されたときのexmpleについては? et1変数は静的であるため、データクラスインスタンスは初期化される前にその変数にアクセスしている可能性があります。メモリリークを防ぐために、ビューへの静的参照を使用しないでください。 テキストを設定するあなたのアクティビティのいくつかのメソッドを呼び出す必要があります。私はあなたのソケット接続データがワーカースレッドで配信されていると思いますが、UIスレッドで 'setText()'メソッドを呼び出す必要があります(https://developer.android.com/reference/android/app/Activity.html#runOnUiThreadを参照)。 (java.lang。 – convexHull

+0

**あなたのソケット接続データはワーカースレッドで配信されると思いますが、UIスレッドのsetText()メソッドを呼び出す必要があります** はい、そのソケット接続はMainActivity.classのスレッドで動作します。 .class'はソケットを呼び出すソケットクラスであり、UIスレッドでもありません。 :(@ convexHull –

+0

MainActivity.classのasynctaskを実行する非アクティビティクラスからUIスレッドメソッドを呼び出す方法@convexHull –

答えて

0
  1. このEditTextをDataクラスに渡します。だからあなたは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を渡す必要があります。

Dataクラス内の複数のEditTextを変更する必要がある場合は、そのクラスにアクティビティを渡す方が適切です。次に、複数のパブリックメソッドを作成してビューの値を変更します。

まず、静的変数がクラスにリンクされていることを覚えておいてください。だから確かにあなたのケースではnull EditTextを初期化するonCreateメソッドは静的ではないためです。

+0

私の 'Data.class'を通して' EditText or Activity'をどのように渡すかの例を挙げてください。@DEADMC –

+0

@ srabonshahadat、look updated posts – DEADMC

+0

th私の望む特定のデータを受け取ったときのデータ受信プロセスでは、 'EditText'を変更したいのですが、' EditText'は既に 'Lv(Activity.class)'に作成されています。 '' Data.class'の '.setText'メソッドによる値です。 @DEADMC –

関連する問題