W
washpuda
Neues Mitglied
- 0
Hallo Leute,
ich bin echt am verzweifeln, ich versuche schon seit zwei Tagen einfach ein Fragment zu einem Constraintlayout programmiertechnisch hinzuzufügen und habe schon total viel recherchiert. Bei den Beispielen stoße ich immer auf das gleiche Problem (java.lang.IllegalArgumentException: No view found for id 0x7f080066 (de.bajestro.picmaptogo:id/frameLayout) for fragment TestBDP{26d90e0 #1 id=0x7f080066} oder so ähnlich). In meiner App muss ich später auch Fragmente während der Laufzeit einfach austauschen können.
Eigentlich bin ich total fit in Java, arbeite aber sonst mit Swing, dort kann man einfach panel.add(otherPanel); aufrufen und mit panel.revalidate() aktualisieren.
Ich baue mir mehrere Dialoge. Damit ich die Grundfunktionalität nicht mehrmals implementieren muss und ich möglichst viel Code wiederverwenden möchte, baue ich mir einen Grunddialog der von FragmentDialog abgeleitet ist. Diesem möchte ich im Konstruktor ein Fragment mit den Individuellen DialogOptionen übergeben. Das übergebene Fragment soll einfach zwischen den beiden Guidelines platziert werden.
Als Beispiel habe ich Activity mit einem Button der den Dialog startet (vorerst ohne anzeige des Übergebenen Fragments).
Wenn ich auf den OK-Button klicke soll das Fragment in der Mitte dargestellt werden, doch leider stürzt es hier immer ab.
Das bekomme ich einfach nicht hin, habe schon alles probiert (direkt hinzugefügt mit und ohne Layout ) und überall nachgelesen. Im Beispiel versuche ich ein FrameLayout als Platzhalter zu tauschen.
Irgendwie hat der Fragmentmanager kein Zugriff auf ein Layout?? Er findet auch das darunterliegende Constraintlayout nicht?? Ich vermute der Fragmentmanager verweist auf irgend etwas ganz anderes?
Ich hoffe mir kann irgendjemand helfen.
Activity mit Button zum Starten des Dialogs:
Grunddialog (oben Titel und unten eine Buttonleiste. Dazwischen soll das übergebene Fragment angezeigt werden)
Das Fragement, was in der Mitte des Dialogs angezeigt werden soll.
ich bin echt am verzweifeln, ich versuche schon seit zwei Tagen einfach ein Fragment zu einem Constraintlayout programmiertechnisch hinzuzufügen und habe schon total viel recherchiert. Bei den Beispielen stoße ich immer auf das gleiche Problem (java.lang.IllegalArgumentException: No view found for id 0x7f080066 (de.bajestro.picmaptogo:id/frameLayout) for fragment TestBDP{26d90e0 #1 id=0x7f080066} oder so ähnlich). In meiner App muss ich später auch Fragmente während der Laufzeit einfach austauschen können.
Eigentlich bin ich total fit in Java, arbeite aber sonst mit Swing, dort kann man einfach panel.add(otherPanel); aufrufen und mit panel.revalidate() aktualisieren.
Ich baue mir mehrere Dialoge. Damit ich die Grundfunktionalität nicht mehrmals implementieren muss und ich möglichst viel Code wiederverwenden möchte, baue ich mir einen Grunddialog der von FragmentDialog abgeleitet ist. Diesem möchte ich im Konstruktor ein Fragment mit den Individuellen DialogOptionen übergeben. Das übergebene Fragment soll einfach zwischen den beiden Guidelines platziert werden.
Als Beispiel habe ich Activity mit einem Button der den Dialog startet (vorerst ohne anzeige des Übergebenen Fragments).
Wenn ich auf den OK-Button klicke soll das Fragment in der Mitte dargestellt werden, doch leider stürzt es hier immer ab.
Das bekomme ich einfach nicht hin, habe schon alles probiert (direkt hinzugefügt mit und ohne Layout ) und überall nachgelesen. Im Beispiel versuche ich ein FrameLayout als Platzhalter zu tauschen.
Irgendwie hat der Fragmentmanager kein Zugriff auf ein Layout?? Er findet auch das darunterliegende Constraintlayout nicht?? Ich vermute der Fragmentmanager verweist auf irgend etwas ganz anderes?
Ich hoffe mir kann irgendjemand helfen.
Activity mit Button zum Starten des Dialogs:
Code:
public class DialogTestActivity extends AppCompatActivity {
Button btnOpenDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog_test);
btnOpenDialog = findViewById(R.id.btnShowDialog);
btnOpenDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TestBDP testBDP = new TestBDP("param1", "param2"); // conatainer fragment
BDialog bDialog = new BDialog( testBDP);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
Fragment prev = fragmentManager.findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
bDialog.show(ft, "dialog");
}
});
}
}
Grunddialog (oben Titel und unten eine Buttonleiste. Dazwischen soll das übergebene Fragment angezeigt werden)
Code:
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import de.bajestro.picmaptogo.R;
import picturemap.tools.Utils;
public class BDialog extends DialogFragment implements View.OnClickListener {
Fragment dialogFragment;
Button btnCancel, btnOK, btnTakeOver, btnDefault;
public BDialog( AbstractBDialogFragment dialogFragment) {
this.dialogFragment = dialogFragment;
setStyle(DialogFragment.STYLE_NO_TITLE,android.R.style.Theme_Holo_Light);
dialogFragment.setBDialog(this);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
System.out.println(" ----- on Create view");
View view = inflater.inflate(R.layout.bdialog, container);
btnOK = view.findViewById(R.id.btnOK);
btnOK.setOnClickListener(this);
btnCancel = view.findViewById(R.id.btnCancel);
btnCancel.setOnClickListener(this);
btnDefault = view.findViewById(R.id.btnDefault);
btnDefault.setOnClickListener(this);
btnTakeOver = view.findViewById(R.id.btnTakeOver);
btnTakeOver.setOnClickListener(this);
return view;
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btnOK:
Utils.print("OK");
FragmentManager fragmentManager = getFragmentManager();
FrameLayout layout = getView().findViewById(R.id.frameLayout);
fragmentManager.beginTransaction().replace(layout.getId(),dialogFragment).commit();
break;
case R.id.btnCancel:
Utils.print("Abbrechen");
break;
case R.id.btnDefault:
Utils.print("Default");
break;
case R.id.btnTakeOver:
Utils.print("takeOver");
break;
default:
throw new IllegalStateException("Unexpected value: " + view.getId());
}
}
}
Das Fragement, was in der Mitte des Dialogs angezeigt werden soll.
Code:
public class TestBDP extends AbstractBDialogFragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
public TestBDP(String mParam1, String mParam2) {
super();
this.mParam1 = mParam1;
this.mParam2 = mParam2;
}
@Override
public void setBestätigt() {}
@Override
public void onBackStackChanged() {}
}
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
abstract class AbstractBDialogFragment extends Fragment implements FragmentManager.OnBackStackChangedListener {
BDialog bDialog;
public AbstractBDialogFragment(){
super();
}
public abstract void setBestätigt();
public void setBDialog(BDialog bDialog){
this.bDialog = bDialog;
}
HTML:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/bDialogLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorAccent"
android:text="@string/dialog"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="@string/cancel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btnTakeOver"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline1" />
<Button
android:id="@+id/btnOK"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/ok"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/btnDefault"
app:layout_constraintTop_toTopOf="@+id/guideline1" />
<Button
android:id="@+id/btnTakeOver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/takeOver"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btnDefault"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/btnCancel"
app:layout_constraintTop_toTopOf="@+id/guideline1" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="29dp" />
<Button
android:id="@+id/btnDefault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:text="@string/default1"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btnOK"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/btnTakeOver" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_end="60dp" />
<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/guideline1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline">
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>