2016-03-20 12 views
0

Ich versuche derzeit, ein Fragment programmatisch hinzuzufügen, das eine Ansicht hat, die ich sofort nach der Erstellung des Fragments initialisieren muss. Ich habe versucht, FragmentManager.executePendingTransactions() direkt nach FragmentTransition.commit() zu verwenden, aber es funktioniert nicht so, wie es sollte. Ich habe eine Forschung und gefunden this, so dass ich festgestellt, dass FragmentManager.executePendingTransactions() funktioniert nicht von onCreate() und dann Code auf onStart(), aber es funktioniert immer noch nicht funktioniert. Obwohl es in meinem Fall von onItemClickListener() heißt, glaube ich nicht, dass es einen Unterschied macht. Hier ist mein Code:FragmentManager.executePendingTransactions ruft onCreateView() nicht sofort auf

@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); 
} 

Antwort

2

In Ordnung, ich habe endlich herausgefunden, was das Problem ist. Der Grund des Problems ist, dass weder fragmentTransaction.commit() noch fragmentManager.executePendingTransactions() die Referenz ändern, die in fragment Variable gespeichert ist. Daher muss ich nach executePendingTransactions() erneut findFragmentById() aufrufen, also referenzieren, dass es sich auf das erstellte Fragment bezieht. Hier ist ein Arbeitscode:

@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); 
} 

Ich hoffe, dass es für jemanden nützlich sein wird.

Verwandte Themen