2016-03-20 11 views
0

現在、フラグメントを作成した直後に初期化する必要のあるビューを持つフラグメントをプログラムで追加しようとしています。 FragmentTransition.commit()の直後にFragmentManager.executePendingTransactions()を使用しようとしましたが、想定どおりに動作しません。私は研究を行い、thisを見つけたので、FragmentManager.executePendingTransactions()onCreate()から機能せず、コードをonStart()に入れても、それでも機能しません。私の場合はonItemClickListener()から呼ばれていますが、それは何の違いもないと思います。ここに私のコード:FragmentManager.executePendingTransactionsはすぐにonCreateView()を呼び出さない

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.vk_music_list); 
    musicProgressBar = new MusicProgressBar(); 
    listView = (ListView) findViewById(R.id.listView); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    listView.setOnItemClickListener(this); 
} 
@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    String audioUrl = ((VKApiAudio) parent.getAdapter().getItem(position)).url; 
    serviceIntent.putExtra("audioUrl", audioUrl); 

    //Inflate music progress bar 
    fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragment = fragmentManager.findFragmentById(R.id.musicBarContainer); 
    if(fragment == null) { 
     fragmentTransaction.add(R.id.musicBarContainer, musicProgressBar) 
       .setTransition(R.anim.move_from_the_bottom) 
       .commit(); 
    } 

    //This guy doesn't work 
    fragmentManager.executePendingTransactions(); 

    //Never get into this, because fragment is always == null 
    if(fragment != null) { 
     SeekBar seekBar = (SeekBar) fragment.getView().findViewById(R.id.progressBar); 
     seekBar.setMax(((VKApiAudio) parent.getAdapter().getItem(position)).duration); 
    } 
    startService(serviceIntent); 
} 

答えて

2

いいえ、私は最後に問題が何かを知った。その理由は、fragment変数に格納されているfragmentTransaction.commit()でもfragmentManager.executePendingTransactions()も参照が変更されていないためです。したがって、executePendingTransactions()の後にfindFragmentById()に再度電話する必要があります。そのため、ストアは作成されたフラグメントを参照します。ここには動作するコードがあります:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    String audioUrl = ((VKApiAudio) parent.getAdapter().getItem(position)).url; 
    serviceIntent.putExtra("audioUrl", audioUrl); 

    //Inflate music progress bar 
    fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragment = fragmentManager.findFragmentById(R.id.musicBarContainer); 
    if(fragment == null) { 
     fragmentTransaction.add(R.id.musicBarContainer, musicProgressBar) 
       .commit(); 
    } 

    //Force to create fragment without scheduling so it's not necessarily to wait until it get scheduled 
    fragmentManager.executePendingTransactions(); 

    //This is what I needed 
    fragment = fragmentManager.findFragmentById(R.id.musicBarContainer); 

    //Set song duration as a seekBar's maximum 
     if (fragment != null) { 
      SeekBar seekBar = (SeekBar) fragment.getView().findViewById(R.id.progressBar); 
      seekBar.setMax(((VKApiAudio) parent.getAdapter().getItem(position)).duration); 
     } 
    startService(serviceIntent); 
} 

私はそれが誰かに役立つことを願っています。

関連する問題