2017-05-20 10 views
0

tab1とtab3もクラスを持ち、tab1のボタンをクリックしてtab3のtextviewを変更したいと思いますが、とにかく見つけられませんでした。 これは私のtab1のクラスです1つのタブでボタンをクリックしてアノータタブでテキストビューを変更

public class tab1Contacts extends Fragment{ 

    TextView tv; 
    EditText et; 
    TextView tv3; 
    personInfo pı; 

    public personInfo returnpı(){ 
     return pı; 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.tab1contents, container, false); 

     Button btn_jog = (Button) rootView.findViewById(R.id.jogging_button); 


     tv = (TextView) rootView.findViewById(R.id.newRecordText); 
     et = (EditText) rootView.findViewById(R.id.durationtext) ; 
     pı = new personInfo(); 
     pı.eyesPower = 100; 
     pı.brainPower = 100; 
     pı.armsPower = 100; 
     pı.legsPower = 100; 
     pı.hearthPower = 100; 
     pı.energyLevel = 100; 
     pı.calorie = 2000; 
     pı.condition = 0; 

      btn_jog.setOnClickListener(new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View v) 
       { 
        int duration = Integer.parseInt(et.getText().toString()); 
        pı.jogging(duration); 
        //I want to change here textview in the tab3. 
       } 
      }); 
     return rootView; 
    } 
} 

これも私のTAB3クラス:TAB3はからイベントをリッスンするため

public class Tab3Contacts extends Fragment { 

    TextView tv3; 
    double newBrainpower; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.tab3contents, container, false); 
     tv3 = (TextView) rootView.findViewById(R.id.list_text) ; 


     return rootView; 
    } 
} 

答えて

0
btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    //pager.setCurrentItem(yourindex);// if you use pager 
    getTabHost().setCurrentTab(yourindex); 

    } 
}); 
+0

getTabHostメソッドを解決できません –

+0

ユーザーがボタンをクリックすると、タブを変更したくありません。私はanoterタブでテキストビューを変更したい –

0

私が正しくあなたの質問を読んでいる場合は、何が必要ですtab1。そのためには、何らかの内部通知/イベントシステムを実装する必要があります。これは、通常、オブザーバー/リスナーを登録する通知処理クラスによって処理されます。

私は維持してきたプロジェクトの例:

public class NotificationManager { 
    public interface Observer { 
     public void update(String notificationName, Bundle data); 
    } 

    private static NotificationManager singletonNotifier = null; 
    private HashMap<String, ArrayList<Observer>> mObservables = null; 

    private NotificationManager() { 
     mObservables = new HashMap<String, ArrayList<Observer>>(); 
    } 

    //enforce singleton 
    public static NotificationManager getInstance() { 
     if (singletonNotifier == null) { 
      singletonNotifier = new NotificationManager(); 
     } 
     return singletonNotifier; 
    } 

    public void addObserver(String notificationName, Observer observer) { 
     // add to map 
     // in multi-threaded apps make sure you use synchronized or a mutex 
    } 

    public void removeObserver(String notificationName, Observer observer) { 
     // remove from map; mind threading 
     // overload as necessary for your design 
    } 

    public void notifyObservers(String notificationName, Bundle data) { 
     // go through your map of observers, build an array of observers 
     // that need to update, then for each observer, call 
     // observer.update(notificationName, data); 
    } 
} 

を次に、あなたのTAB3クラスはオブザーバーインタフェースを実装し、オブジェクトの構造上のタイプの文字列値でNotificationManagerに自身を登録する必要があります通知それはそのyのすべての変更を行いますupdate(String, Bundle)方法を、実装する必要があります呼び出し

NotificationManager.getInstance().addObserver("Tab1DataChange", this); 

を使用して、(代わりに文字列リテラル引数の定数のためのベストプラクティスを使用)望んでいます必要があります。 tab1のオブジェクトのクラスで次に 、クリックリスナーにこの呼び出しを追加:データは、観察者が応答するために知っておく必要があります任意の情報である

NotificationManager.getInstance().notifyObservers("Tab1DataChange", data); 

を。コードをデカップリングするという考え方に沿って、明示的に1つのリスナー用のデータバンドルを作成しないでください。同じイベントをリッスンするために何か別のものが必要な場合があるからです。誰がイベントを消費しているかにかかわらず、更新する必要があるものを含むようにデータバンドルを設計することで、今や悲しみを解消してください。

私にとって教訓: Androidのライフサイクルに注意してください。アクティブビューのOnPauseとOnDestroyは、オブザーバオブジェクトが利用できない間に何かイベントがトリガされた場合にnullポインタ例外にならないように、リスナを登録解除する必要があります。 OnCreateとOnResumeは再登録する必要があります。場合によっては、OnPause/OnResumeについて心配することはできませんでしたが、アプリによっては必要になる場合もあります。

関連する問題