2017-11-08 19 views
2

私はフラグメントを持ち、親アクティビティ(次のコードブロックを参照)と通信するためにインタフェースを使用します。私は基本的な例を含んでいますが、Spotify OnPlaybackEventから関数updateTextView()を呼び出すときにTextViewがアクティビティを更新していないという問題があります。 Handlersとrunonuithreadを試してみましたが、何も動かないようです。Android:アクティビティのTextViewテキストをフラグメントから更新することはできません

これは私の断片である:

public class PlayerFragment extends Fragment implements SpotifyPlayer.NotificationCallback, ConnectionStateCallback { 

    public ImageView playButton; 
    public TrackOperations trackOperationsCallback; 

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

     rootView = inflater.inflate(R.layout.player_fragment, container, false); 

     playButton = (ImageView) rootView.findViewById(R.id.playButton); 


     playButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //THIS WORKS! 
       trackOperationsCallback.updateTextView(); 
      } 
     }); 

     return rootView; 
    } 

    @Override 
    public void onPlaybackEvent(PlayerEvent playerEvent) { 
     if(playerEvent.equals(kSpPlaybackNotifyTrackDelivered)){ 
      //THIS IS PRINTED WHEN A SONG ENDS 
      Log.d(spoty.TAG, "Player: Event " + playerEvent); 

      //BUT THIS DONT WORK 
      trackOperationsCallback.updateTextView(); 
     } 
    } 

    public interface TrackOperations { 
     public void updateTextView(); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     try { 
      trackOperationsCallback = (TrackOperations) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement TrackOperations"); 
     } 
    } 

} 

これは私の親アクティビティです:

public class QueueActivity extends Activity implements PlayerFragment.TrackOperations { 

    private TextView queueSong; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     queueSong = (TextView) findViewById(R.id.queueSong); 
    } 

    @Override 
    public void updateTextView(){ 
     //THIS IS PRINTED IN BOTH CASES 
     Log.d(spoty.TAG, "Called!"); 

     //THIS WORKS IF IS CALLED FROM THE BUTTON CLICK OF THE FRAGMENT 
     //BUT DONT WORK WHEN CALLED FROM THE EVENT IN FRAGMENT 
     queueSong.setText("ANY RANDOM TEXT"); 
    } 
} 

私はこれで日苦労してきたので、何かアドバイスは大歓迎されます。前もって感謝します。

+0

'onPlaybackEvent'スレッドが呼び出されるのはどうですか? –

+0

updateCurrentTrack()で実際に何をしていますか?問題はそのメソッドのコードかもしれません。 –

+0

updateCurrentTrack()= updateTextField()= updateTextView()? あなたは誤って同じメソッドに異なるメソッド名を使用していますか?または、インターフェイスに複数のメソッドがありますか? –

答えて

1

これは最善の方法ではありませんが、データ転送に問題が発生した場合は、Fragment to Fragmentsコミュニケーションを含むSharedPreferencesを使用して解決します。これはあなたの問題を確実に解決します

+0

Carlosに感謝しますが、これで問題は解決しません。関数が呼び出され、これによってデータが受信されています。唯一の問題は、TextViewがその値を更新しないことです。 – Roger

+0

おそらく、テレビを呼び出すと正しくインスタンス化されていない可能性があります。 "queueSong =(TextView)findViewById(R.id.queueSong); " のupdateTextViewメソッドに移動してみてください –

+0

ありがとうございます。 – Roger

関連する問題