2016-07-11 3 views
0

私のアクティビティフロー、ログインページ - >メインページ(これはUserprofileに移動するボタンがあります。 onclickメソッド) - >ボタンonclickメソッドは "startactivity(Userprofile)"です 私はonClickアクティビティをロードするメソッドUserprofileを持っています。 私はユーザーの詳細をロードしたい、私はいくつかのstatic変数がありますが、運がありません。public static変数は値を持っていますが、別のクラスのテキストビューに表示しようとすると値がありません

public class Userprofile extends AppCompatActivity { 
    TextView textView , textView1 , textView2 ; 
    Context context_userprofile; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_userprofile); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     func_userprofile_show(); 
    } 

    public void func_userprofile_show(){ 
     String type = "linkuser"; 
     DatabaseLink databaseLink = new DatabaseLink(this); 
     databaseLink.execute(type); 
     context_userprofile = getApplicationContext(); 
     textView = (TextView)findViewById(R.id.tvprofilepage_user); 
     assert textView != null; 
     textView.setText(DatabaseLink.thename); 
     textView1 = (TextView)findViewById(R.id.tvprofilepage_ign); 
     assert textView1 != null; 
     textView1.setText(DatabaseLink.theign); 
     textView2 = (TextView)findViewById(R.id.tvprofilepage_emailid); 
     assert textView2 != null; 
     textView2.setText(DatabaseLink.theemail); 
    } 
} 

さて、これはAsyncTaskを拡張切り抜いたクラスのメソッドであり、「theign」AlertDialogではなくTextViewに表示されます。

+0

使用インターフェイスとあなたを更新ビューがある場合 – Raghunandan

+0

AsyncTaskが完了したときに値が入力されるため、theignはUserprofileでまだnullであると思います。 @Raghunandanは、タスクが終了したときにコールバックを保持してから、テキストをtextViewに設定すると述べています。 – Raghavendra

+0

値が正しく入力されたときに、ポスト実行で 'Activity'を起動します。 –

答えて

0

問題は、AsyncTaskが終了する前にtextView.setTextが呼び出されることです。

問題を解決するには、情報が準備されているときにアクティビティ内の関数を呼び出すためのインターフェイスを実装できます。

public interface DatabaseLinkInterface { 
    public void databaseLinkFinished(); 
} 

コンテキストはまた、リスナーになります:AsynkTaskと仮定すると があなたDatabaseLinkクラス内で、私は

インタフェース..あなたにいくつかの擬似コードをまくします。あなたはDatabaseLinkクラスにコンテキストを持っている:

@Override 
protected void onPostExecute(String result) { 
    myJSON = result; 
    decodejson(); 
    alertDialog.setMessage(theign); 
    alertDialog.show(); 
    DatabaseLinkInterface mListener = (DatabaseLinkInterface) context; 
    mListener.databaseLinkFinished(); 
} 

は、あなたの活動のインタフェースを実装してのonCreateでDatabaseLinkを作成します。

public class Userprofile extends AppCompatActivity implements DatabaseLinkInterface { 
    TextView textView , textView1 , textView2 ; 
    Context context_userprofile; 
    DatabaseLink databaseLink; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_userprofile); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     String type = "linkuser"; 
     databaseLink = new DatabaseLink(this); 
     databaseLink.execute(type); 
    } 

    ... 

そして最後に、あなたの活動に、とき知っているインターフェイスメソッドを実装しますデータが取り出される。 func_userprofile_show()を削除します。 この目的で静的変数を使用しないでください。

@Override 
public void databaseLinkFinished(){ 
    context_userprofile = getApplicationContext(); 
    textView = (TextView)findViewById(R.id.tvprofilepage_user); 
    assert textView != null; 
    textView.setText(databaseLink.thename); 
    textView1 = (TextView)findViewById(R.id.tvprofilepage_ign); 
    assert textView1 != null; 
    textView1.setText(databaseLink.theign); 
    textView2 = (TextView)findViewById(R.id.tvprofilepage_emailid); 
    assert textView2 != null; 
    textView2.setText(databaseLink.theemail); 
} 

私も属性に直接代わりにアクセスのゲッターとセッターを使用することをお勧めいたします - 活動へのコールバックとして(databaseLink.theemail)> databaseLink.getTheEmail()

+0

私はUserprofile(活動)に干渉を書き込む必要がありますか? およびmlistener = context、mlistenerはコンテキストタイプではありません –

+0

populateData()を呼び出す必要がある場合、databaselinkFinished()には何を入れる必要がありますか? .... sryが、私は段階的に学習しています:P。 –

+0

私は間違いを修正しました.personateData()は実際にはdatabaselinkFinished()です。次に、Userprofileアクティビティ内にDatabaseLinkInterfaceを実装するため、mListener = contextとなります。したがって、AsyncTaskがfinissedされると、activity.databaselinkFinished()が呼び出され、オブジェクトがいっぱいになったことが通知されます。 – adalPaRi

関連する問題