[OFFEN] Rückkehr aus Dialog Fragment. Wie?

B

Braesident

Ambitioniertes Mitglied
1
Hallo Leute,

Ich hab ein Dialog mit Recycler- und Card-View nach dieser YT Vorlage erstellt. Die Cards haben ein Button der je nach Situation entweder direkt etwas ausführen soll oder aber, und da hakt es nun, der Dialog wieder geschlossen werden soll und die MainActivity neu gestartet. Ich bin da echt Ratlos.

Das Fragment rufe ich folgend auf:
Code:
            final android.app.FragmentManager fragmentManager = getFragmentManager();
            final DialogListFragment tv = new DialogListFragment();

            tv.show(fragmentManager,"TV_Tag");

Code:
public class RecyclerHolder extends RecyclerView.ViewHolder {

    TextView textView1;
    TextView textView2;
    ImageButton imageButton;

    public RecyclerHolder(View itemView) {
        super(itemView);

        textView1 = (TextView) itemView.findViewById(R.id.id_tvNumber);
        textView2 = (TextView) itemView.findViewById(R.id.id_tvClient);
        imageButton = (ImageButton) itemView.findViewById(R.id.id_ibtnAction);
    }
}

Code:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerHolder> {

    Context     c;
    ArrayList<JoblistObject> jobs;

    public RecyclerAdapter(Context c, ArrayList<JoblistObject> jobs){
        this.c  = c;
        this.jobs = jobs;
     }


    @Override
    public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.joblist_row, parent, false);
        RecyclerHolder holder = new RecyclerHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(final RecyclerHolder holder, int position) {

        final JoblistObject job = jobs.get(position);
        holder.textView1.setText(job.getNumber());
        holder.textView2.setText(job.getClient());

        if (job.isStatus())
            holder.imageButton.setImageResource(R.drawable.ic_menu_send);
        else
            holder.imageButton.setImageResource(R.drawable.ic_menu_edit);

        holder.imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (job.isStatus()){
                   // Do Action

                }else{
                    SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(c).edit();
                    editor.putString("current_id", job.getNumber());
                    editor.commit();

       //  HIER soll der Dialog geschlossen werden und die Main neu gestartet.

                }

            }
        });
    }

    @Override
    public int getItemCount() {
        return jobs.size();
    }
}
 
Zuletzt bearbeitet:
Hallo Braesident,

der Dialog wieder geschlossen werden soll und die MainActivity neu gestartet. Ich bin da echt Ratlos.

Zuerst einmal : Warum möchtest du eine Activity neu "starten" . Dieser Vorgang ist erst mal ungewöhnlich ,
womit beendest du sie denn zuvor , oder wie rufst du sie denn auf ? Mit Intents oder als Launch/Main aus der Manifest ? Ist das eine erweiterte Activity ?

Im Adapter hast du ja schon den ClickListener. Was spricht dagegen , sich den Standardfunktionen zu bedienen. z.b. dismiss ??
 
Ich beende sie im Grunde gar nicht. Ich rufe aus der Activity den Dialog via Fragment auf. Der Dialog dient mir dazu andere Daten für die aufrufende Activity auszuwählen. Der Adapter erstellt den passenden Button für jeden Listeneintrag.

Ich bekomme es leider nicht hin den Dialog über diese Button zu beenden. Ein dismiss() kann hier nicht benutzt werden. Ist dem Adapter nicht bekannt.

Das neu starten der aufrufenden Activity könnte vielleicht hinfällig sein wenn ich es verstanden habe wie die Activity mitbekommt das dass Fragment beendet wurde.
 
Problem ist gelöst. Werde heut Abend an dieser Stelle die Lösung posten.

Danke

Ich habe dem Fragment noch ein Response hinzugefügt der eine Aktion ausführen kann wenn der Dialog beendet wird. Und ich übergebe vom Fragment an den Adapter nicht nur this.getActivity() sondern zusätzlich noch getDialog(). Über diesen kann dann im Adapter dialog.dismiss() aufgerufen werden.

Code:
public class DialogListFragment extends DialogFragment {
    RecyclerView recyclerView;
    RecyclerAdapter adapter;
    ArrayList<JoblistObject> jobs = new ArrayList<JoblistObject>();
    public interface Response {
        void processFinish();
    }
    public Response delegate = null;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // ...
  
  View rootView = inflater.inflate(R.layout.joblist_dialog,container);
        recyclerView = (RecyclerView) rootView.findViewById(R.id.id_rvJoblist);
        recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        adapter = new RecyclerAdapter(this.getActivity(), jobs, getDialog());
        recyclerView.setAdapter(adapter);
        return rootView;
    }
    public void setResponse(Response response){
        delegate = response;
    }
    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        delegate.processFinish();
    }
}
Aufgerufen wird es so
Code:
final android.app.FragmentManager fragmentManager = getFragmentManager();
final DialogListFragment dlf = new DialogListFragment();
dlf.setResponse(new DialogListFragment.Response() {
    @Override
    public void processFinish() {
        Toast.makeText(MainActivity.this,"Response",Toast.LENGTH_LONG).show();
    }
});
dlf.show(fragmentManager,"dlf_tag");
Und den Adapter hab ich folgend abgeändert
Code:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerHolder> {

    Context     c;
    ArrayList<JoblistObject> jobs;
    Dialog  dialog;

    public RecyclerAdapter(Context c, ArrayList<JoblistObject> jobs
, Dialog dialog
){
       
        this.c  = c;
        this.jobs = jobs;
        this.dialog = dialog;
     }


    @Override
    public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.joblist_row, parent, false);
        RecyclerHolder holder = new RecyclerHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(final RecyclerHolder holder, int position) {

        final JoblistObject job = jobs.get(position);
        holder.textView1.setText(job.getNumber());
        holder.textView2.setText(job.getClient());

        if (job.isStatus())
            holder.imageButton.setImageResource(R.drawable.ic_menu_send);
        else
            holder.imageButton.setImageResource(R.drawable.ic_menu_edit);

        holder.imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (job.isStatus()){
                   // Do Action

                }else{
                    SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(c).edit();
                    editor.putString("current_id", job.getNumber());
                    editor.commit();

                   dialog.dismiss()
                }

            }
        });
    }

    @Override
    public int getItemCount() {
        return jobs.size();
    }
}
 
Zuletzt bearbeitet:
Es gibt noch eine andere Möglichkeit, das Fragment zu schließen. Statt mit ein Observer zu arbeiten, was wegen den Lifecycle von Android nur suboptimal ist, kann man auch ein BroadcastReceiver benutzen.

how to use LocalBroadcastManager?
 
  • Danke
Reaktionen: Braesident

Ähnliche Themen

R
  • Robby1950
2
Antworten
23
Aufrufe
1.007
Robby1950
R
M
Antworten
3
Aufrufe
147
moin
M
B
Antworten
6
Aufrufe
1.049
jogimuc
J
Zurück
Oben Unten