it-swarm.com.de

Wie ändere ich die Ansicht in einem Fragment?

Ich habe ein Fragment, das seine Ansicht in onCreateView erstellt, wie Sie es erwarten würden. Ich möchte jedoch die Ansicht regelmäßig ändern.

Mein Anwendungsfall ist, dass das Fragment einige Daten von einem Webdienst anzeigt. Wenn ein Benutzer eine Option aus einer Liste (einem anderen Fragment) auswählt, sollte dieses Fragment in eine Fortschrittsanzeige wechseln und nach dem Laden wieder in die Datenansicht wechseln.

Ich könnte zwei Fragmente erstellen - das Ladefragment und das Anzeigefragment, aber da dies ein gekapseltes Ereignis ist, würde ich es vorziehen, alles in einem Fragment zu tun.

Grundsätzlich frage ich, was ist das Äquivalent von setContentView in einem Fragment.

42
monkjack

Sie können Fragment.getView() verwenden. Dies gibt die Ansicht des Containers zurück, der das Fragment enthält. In dieser Ansicht können Sie removeAllViews aufrufen. Erstellen Sie dann Ihre neuen Ansichten und fügen Sie sie der Ansicht hinzu, die Sie von getView() erhalten haben.

http://developer.Android.com/reference/Android/app/Fragment.html#getView ()

32
bplayer

Wenn Sie aus irgendeinem Grund die gesamte Fragmentansicht ändern möchten (z. B. eine asynchrone URL-Anforderung, die die Ansicht bei Erfolg ändert), können Sie entweder die FragmentTransaction in der übergeordneten Aktivität verwenden und im laufenden Betrieb ein neues Fragment erstellen.

Oder Sie können das Fragment behalten und eine Methode dieses Fragments aufrufen, die sich selbst aktualisiert. Beispiel: In der übergeordneten Aktivität erstelle und speichere ich eine Liste von Fragmenten List<RefreshFragment> mFragmentList.

Hier ist die RefreshFragment-Klasse (und alle meine Fragmente erweitern dieses in meinem Beispiel):

public class RefreshFragment extends Fragment {
    protected Data data; // here your asynchronously loaded data

    public void setData(Data data) {
        this.data = data;
        // The reload fragment code here !
        if (! this.isDetached()) {
            getFragmentManager().beginTransaction()
               .detach(this)
               .attach(this)
               .commit();
        }
    }
}

Dann kann ich in meiner Aktivität asynchronen Rückruf anrufen:

for (RefreshFragment f : mFragmentList) f.setData(data);

So wird jedes Fragment mit den richtigen Daten aktualisiert und das aktuell angehängte Fragment wird sich sofort selbst aktualisieren. Natürlich müssen Sie in den Fragmenten Ihr eigenes onCreateView bereitstellen.

Wichtig ist, dass sich ein Fragment mit getFragmentManager() neu laden kann.

26
Solostaran14

Sie können ein FrameLayout verwenden, um zwischen Ihrer Fortschrittsanzeige und der Datenansicht zu wechseln, z.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">
    <ImageView Android:id="@+id/cover_image"
        Android:scaleType="fitCenter"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" />
    <ProgressBar Android:id="@+id/cover_progress"
        Android:layout_height="wrap_content"
        Android:layout_width="wrap_content"
        Android:layout_gravity="center"/>
</FrameLayout>

In onViewCreate() würden Sie dann beide Sichten in Instanzfeldern speichern

public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
    ...
    image = (ImageView) container.findViewById(R.id.cover_image);
    progress = container.findViewById(R.id.cover_progress);
    ...
}

und wann immer Sie zwischen den beiden wechseln möchten (denken Sie daran, dies in Ihrer Benutzeroberfläche/Haupt-Thread zu tun), tun Sie einfach etwas wie

progress.setVisibility(View.INVISIBLE);
image.setVisibility(View.VISIBLE);
4

Erstellen Sie eine "Dummy" -Standardansicht

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

</LinearLayout>

Erweitern Sie die "Dummy" -Standardansicht in der onCreateView-Methode des Fragments und verwenden Sie sie als Platzhalter, um Ansichten nach Bedarf hinzuzufügen

private LayoutInflater mInflater;
private ViewGroup mContainer;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
    mInflater = inflater;
    mContainer = container;

    View v =inflater.inflate(R.layout.home_view,container,false);
    placeholder = (ViewGroup) v;

    return placeholder;
}

Um die Ansicht in eine neue Ansicht zu ändern, entfernen Sie zuerst alle vorherigen Ansichten, blasen dann die neue Ansicht auf und fügen sie hinzu

View newView = mInflater.inflate(R.layout.custom_dash, mContainer, false);
placeholder.removeAllViews();
placeholder.addView(newView);
2
Ovokerie Ogbeta

Hier ist eine einfachere Lösung: Speichern Sie den Inflater und den Container, die Sie in onCreateView erhalten, und verwenden Sie sie später. Beispielsweise:

private LayoutInflater mInflater;
private ViewGroup mRootView;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mInflater = inflater;
    mRootView = container;
    return null;
}

public void someCallBackLater() {
    // mRootView.removeAllViews();   // in case you call this callback again...
    mInflater.inflate(R.layout.my_layout, mRootView);
}
2
jazzgil

Mit Solostaran14s Antwort mache ich das jetzt:

Schnittstelle:

public interface FragmentReattachListener {

    public void reAttach();

}

Fragment:

public class MyFragment extends Fragment implements  FragmentReattachListener {
//...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //...
    App.registerFragmentReattachListener(this);
    //...
}

//...    

@Override
public void reAttach() {
    FragmentManager f = getFragmentManager();
    if (f != null) {
         f.beginTransaction()
                    .detach(this)
                    .attach(this)
                    .commit();
        }
    }

}

ab Anwendungsklasse:

private static void reattachFragments() {
        if (fragmentReattachListeners.size() > 0) {
            for (FragmentReattachListener listener : fragmentReattachListeners) {
                listener.reAttach();
            }
        }
    }
1
IHeartAndroid

Sie können Transaktion entfernen und hinzufügen. Ich habe ein Fragment verwendet, in das ich jede Ansicht laden kann. Der Konstruktor des Fragments muss eine Ganzzahl haben, diese Ganzzahl ist R.Layout .... Ich entferne einfach das alte Fragment und setze ein neues. !!! Es funktioniert nur, wenn Sie dieses Fragment dynamisch machen und nicht im XML-Layout. Erstellen Sie einfach so etwas wie ein LinearLayout R.id.fragment_layout

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.wundlist_fragmente);
    Log.v("WoundListActivity", "WoundListActivity gestartet...");

    Log.v("WoundListActivity", "Liste...");
    //dynamisch hinzufügen...
    wlf=new WoundListFragment();        
    fm.beginTransaction().add(R.id.fragment_layout,wlf).commit();

}

//If Menubutton Clicked change

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId()==R.id.itemaddwound){
        Log.v("List", "neue Wunde Activity");

        fm.beginTransaction().remove(wlf).commit();
        fm.beginTransaction().add(R.id.fragment_layout, new NewWoundFragment()).commit();

    }

    return super.onOptionsItemSelected(item);
}
1
user1503361