Android:将数据从ViewPager2和TabLayout管理的片段发送到包含的活动中

问题描述 投票:0回答:1

我正在用Android构建代码编辑器,我有一个EditorActivity,它由ViewPager2和带有动态添加标签的TabLayout组成。创建新标签后,我的视图分页器将创建一个新片段,其中包含要写入代码的EditText。

[按下按钮时,我想遍历每个选项卡并获取其代码,但是我对如何做到这一点一无所知。有人可以帮我清理一下吗?谢谢

我将发布必要的代码

EditorActivity

package com.aregevdev.ccdroid.activity;

import android.app.AlertDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;

import com.aregevdev.ccdroid.R;
import com.aregevdev.ccdroid.others.AppUtils;
import com.aregevdev.ccdroid.others.Project;
import com.aregevdev.ccdroid.others.adapters.EditorTabPageAdapter;
import com.aregevdev.ccdroid.others.wandbox.CodeFile;
import com.aregevdev.ccdroid.others.wandbox.Compiler;
import com.aregevdev.ccdroid.others.wandbox.WandboxEntryPoint;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * Activity for editing open projects, loads a projects and allows editing, saving an running it
 */
public class EditorActivity extends AppCompatActivity {

    // Views
    private TabLayout tabs;
    private ViewPager2 pager;
    private EditorTabPageAdapter adapter;

    // The currently opened project
    private Project currentProject;

    // Firebase
    private FirebaseFirestore firestore;
    private FirebaseUser user;

    // Used for sending requests for wandbox, contains the HTTP libaray and a WandboxService
    private WandboxEntryPoint entryPoint;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_editor);

        // Get the project index from the project list
        Bundle prev = getIntent().getExtras();
        assert prev != null;
        String pos = prev.getString("POS");
        assert pos != null;

        // Initialize firebase
        user = FirebaseAuth.getInstance().getCurrentUser();
        firestore = FirebaseFirestore.getInstance();

        // Initialize Wandbox API
        entryPoint = new WandboxEntryPoint();

        // Load the project using the position from Firestore
        DocumentReference reference = firestore.collection("users").document(user.getUid()).collection("projects").document(pos);
        reference.get().addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();

                // Convert the data to a Project and assign it
                currentProject = document.toObject(Project.class);

                // Get the views
                tabs = findViewById(R.id.tabs);
                pager = findViewById(R.id.pager);
                pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
                    @Override
                    public void onPageSelected(int position) {
                        super.onPageSelected(position);
                        Toast.makeText(EditorActivity.this, "Page #" + position, Toast.LENGTH_SHORT).show();
                    }
                });

                // Create the adapter
                adapter = new EditorTabPageAdapter(EditorActivity.this, currentProject.getFiles());
                pager.setAdapter(adapter);

                // Connect the TabLayout and the ViewPager2
                new TabLayoutMediator(tabs, pager, (tab, position) -> tab.setText(currentProject.getFiles().get(position).getFilename())).attach();
            } else {
                AppUtils.showTaskError(EditorActivity.this, task);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_editor, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item_add:

                // Ask the user for a filename, then create a new tab
                LayoutInflater inflater = getLayoutInflater();
                final View view = inflater.inflate(R.layout.dialog_prompt, null);

                // Build the new project dialog
                AlertDialog.Builder builder = new AlertDialog.Builder(this)
                        .setTitle("Add a new snippet")
                        .setView(view)
                        .setPositiveButton(R.string.ok, (dialog, which) -> {
                            EditText et = view.findViewById(R.id.editText_filename);

                            // Add a new file to the list
                            currentProject.addCodeFile(new CodeFile(et.getText().toString(), ""));

                            // Update the tab layout
                            adapter.notifyDataSetChanged();
                        });

                builder.create().show();
                break;

            case R.id.item_run:

                // Return if there are no files in the project
                if (currentProject.getFiles().isEmpty())
                    return super.onOptionsItemSelected(item);

                // Don't freeze the UI thread, perform the request asynchronously using Retrofit
                Call<List<Compiler>> called = entryPoint.getService().list();
                called.enqueue(new Callback<List<Compiler>>() {
                    @Override
                    public void onResponse(Call<List<Compiler>> call, Response<List<Compiler>> response) {
                        List<Compiler> compilers = response.body();
                        Toast.makeText(EditorActivity.this, compilers.get(0).displayName, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onFailure(Call<List<Compiler>> call, Throwable t) {
                        Toast.makeText(EditorActivity.this, "Failed to send request: " + t.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
                break;
            default:
                break;
        }

        return super.onOptionsItemSelected(item);
    }

    public void saveProject() {
        // Save the project to currentProject files
    }
}

TabEditorFragment

package com.aregevdev.ccdroid.fragment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.aregevdev.ccdroid.R;
import com.aregevdev.ccdroid.activity.EditorActivity;
import com.google.android.material.textfield.TextInputLayout;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.FirebaseFirestore;

public class TabEditorFragment extends Fragment {

    private String code;
    private String position;
    private FirebaseUser user;
    private FirebaseFirestore firestore;

    public TabEditorFragment(String code, String position) {
        this.code = code;
        this.position = position;
        this.user = FirebaseAuth.getInstance().getCurrentUser();
        this.firestore = FirebaseFirestore.getInstance();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_editor_tab, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        TextInputLayout textInputLayoutCode = view.findViewById(R.id.textInputLayout_code);
        EditText editTextCode = textInputLayoutCode.getEditText();
        editTextCode.setText(code);

        // Get the code from here for each tab
    }
}

EditorTabPageAdapter

package com.aregevdev.ccdroid.others.adapters;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;

import com.aregevdev.ccdroid.fragment.TabEditorFragment;
import com.aregevdev.ccdroid.others.wandbox.CodeFile;

import java.util.List;

public class EditorTabPageAdapter extends FragmentStateAdapter {

    private List<CodeFile> dataSet;

    public EditorTabPageAdapter(@NonNull FragmentActivity fragmentActivity, List<CodeFile> dataSet) {
        super(fragmentActivity);
        this.dataSet = dataSet;

    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return new TabEditorFragment(dataSet.get(position).getCode(), String.valueOf(position));
    }

    public void setDataSet(List<CodeFile> dataSet) {
        this.dataSet = dataSet;
    }

    @Override
    public int getItemCount() {
        return dataSet.size();
    }
}

各种帮助将不胜感激

java android android-viewpager
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.