0

Ich habe eine TabActivity, die zwei Registerkarten hat. Ich lade separate Aktivität in jede Registerkarte (Aktivität A & B). Aktivität A, die in Registerkarte 1 geladen wird, hat einige Steuerelemente und ListView. Ich verwende AsyncTask, um Daten von einem Web-Service für diese ListView zu laden. Ich musste eine andere Aktivität laden, wenn Benutzer auf ListView-Element klickte, aber diese neue Aktivität C sollte in derselben ausgewählten Registerkarte geladen werden.Wie verwendet man asynctask in android-support-v4.jar Fragment?

Ich suchte im Internet und fand heraus, dass ich ActivityGroup verwenden kann ... aber zur gleichen Zeit fand ich, dass es veraltet ist. Also mit Android-Unterstützung-v4 Kompatibilität Frangment vorgeschlagen wurden ..

ich heruntergeladen dass android-support-v4.jar und an den FragmentTabs Probe sah, bekam ich es, wie ich Fragmente können auch in Android 2.1 .... so ersetzt ich die beiden Aktivitäten, die ich mit zwei Fragmente in Tabs,

Aber jetzt weiß ich nicht zeigen, wurde, wie die Folge Situationen zu bewältigen:

  1. ListView & Andere Steuerelemente werden nicht angezeigt, wenn ich den folgenden Code ausführe.

  2. ich habe AsyncTask zu nennen ... es einige Zeit dauern wird & Parsen XML-Daten von dem Server zu erhalten und Fragment der onCreateView früher genannt wird ... so wie kann ich den Listview in Fragmente nach seinem onCreateView heißt?

  3. Nach Listview-Elemente geklickt wird, werde ich ein anderes Fragment C innerhalb desselben Registerkarte laden muß ... Wie kann ich das erreichen?

-Code für mein Fragment ist wie folgt:

public class UpdatesFragment extends Fragment implements IFeedReceiver { 
ArrayList<Feed> _feeds; 
Integer _currentPage = 1; 
ListView _lvUpdates; 
UserMessage _userMessage; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    getFeeds(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.updates, container, false); 
    this._lvUpdates = (ListView)v.findViewById(R.id.listUpdates); 

    return v; 
} 

private void getFeeds() { 
    FeedsCollectorAsyncTask task = new FeedsCollectorAsyncTask(
      getActivity(), this._currentPage); 
    task.execute(); 
} 

//This method is called from AsyncTask upon receiving & parsing data. So i m trying to populate my ListView here 
@Override 
public void onFeedReceived(ArrayList<Feed> feeds) { 
    FeedsAdapter adapter = new FeedsAdapter(getActivity(), 
      R.layout.feed_list_item, this._feeds); 

    this._lvUpdates.setAdapter(adapter); 

    // Load detail on item click 
    this._lvUpdates.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int index, 
       long id) { 

     } 
    }); 
} 

}

Haupt Tab Activity XML ist wie folgt.

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/tabhost" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="5dp">   
    <FrameLayout 
     android:id="@android:id/tabcontent" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="0"/> 
    <FrameLayout 
     android:id="@+android:id/realtabcontent" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"/> 

    <TabWidget 
     android:id="@android:id/tabs" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="-6dp"/> 
</LinearLayout> 

Und schließlich ...

public class PlayMakerActivity extends FragmentActivity { 
/** Called when the activity is first created. */ 
TabHost tabHost; 
TabManager mTabManager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Resources res = getResources(); // Resource object to get Drawables 
    // TabHost tabHost = getTabHost(); // The activity TabHost 
    tabHost = (TabHost) findViewById(android.R.id.tabhost); 
    tabHost.setup(); 

    mTabManager = new TabManager(this, tabHost, R.id.realtabcontent); 

    mTabManager.addTab(tabHost.newTabSpec("Upudates").setIndicator("Updates"), 
      UpdatesFragment.class, null);  
} 
} 

//also included the following AS It IS 
public static class TabManager implements TabHost.OnTabChangeListener { 
    .... 
    .... 
    .... 
} 

Sie können mich bis zu einem gewissen Beispiel zeigen. Ihre Hilfe wird sehr geschätzt !.

Antwort

1

Ich bin neu in Android-Entwicklung, aber ich habe ein paar dieser Probleme mit der Konvertierung zu Fragmenten begegnet, so werde ich versuchen, so gut wie möglich zu helfen.

  1. Diese Frage hängt mit der Sekunde zusammen, die ich denke, also werde ich sie einfach ignorieren und hoffe, dass Antwort 2 sie gut genug anspricht.

  2. Ich bin in eine ähnliche Situation geraten, in der ich eine Aktivität, die eine AsyncTask verwendet, in ein Fragment umgewandelt habe. Ich bin mir nicht sicher, ob das eine gute Übung ist, aber ich habe einfach meine Logik, die ursprünglich in onCreate war (in Ihrer Situation der Aufruf von ListView und getFeeds()) in die onCreateView-Methode verschoben.

  3. Bis zum Fragment Traversal habe ich eine Basis FragmentAktivität verwendet, die das erste Fragment in den entsprechenden Container im Layout der FragmentAktivitäten legt. Wenn Sie ein weiteres Fragment laden möchten, sollten Sie auf den FragmentManager von FragmentActivity verweisen, eine neue Transaktion starten und ein neues Fragment hinzufügen. Die android developer website erklärt das alles gründlich.

Wenn Sie wollen von einem offenen Fragmente direkt ein neues Fragment starten, dann wollen Sie den Host FragmentActivity mit getActivity() zuerst verweisen. Zum Beispiel:

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();

hoffe, das hilft!

An alle anderen: Ich bin auch neu hier auf Frage zu beantworten, also lassen Sie mich wissen, wenn ich Änderungen an zukünftigen Antworten vornehmen sollte, die ich poste.

+0

Vielen Dank für diese detaillierte Antwort. Ich hatte andere Probleme, aber eine ihrer Lösungen enthalten, was Sie vorgeschlagen haben. So werde ich es als Antwort akzeptieren .. danke nochmal – Aamir

+0

Kein Problem, froh, ich könnte in irgendeiner Weise helfen, Junge. – RonMon

Verwandte Themen