открыть документ PDF после выбора в списке фрагментов - PullRequest
0 голосов
/ 27 февраля 2020

Хорошо, что я хочу, когда я нажимаю на элемент в моем списке, который у меня есть в моем домашнем фрагменте, открываю документ, и я могу читать его и прокручивать. Мне удалось показать мне все файлы pdf моего android, и я хорошо загружаю его в массив, но когда я нажимаю, я получаю ошибку.

Этот метод позволит нам заменить фрагменты, которые нам нужны. Код входит в MainActivity.java

public class HomeFragment extends Fragment {

    // CREAR VARIABLES A USAR

    private File dir;
    private ListView lv_pdf;
    boolean bolean_permission;
    SearchView searchView;
    PDFView pdfView;
    int position = -1;




    private static ArrayList<File>
            fileList = new ArrayList<>();

    public HomeFragment() {
        // Required empty public constructor  CONSTRUCTOR VACIO DE LA CLASE HOME FRAGMENT
    }


    public static HomeFragment newInstance(/*parámetros*/) {
        // Setup parámetros           SETEO PARAMETROS
        return new HomeFragment();
    }



    //ejecutas la lógica
    //de arranque básica de la aplicación que debe ocurrir una sola vez en toda la vida de la actividad
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

        if (getArguments() != null) {
            // Gets parámetros   OBTENGO PARAMETROS



            pdfView = (PDFView) getActivity().findViewById(R.id.pdfView);

            position = getActivity().getIntent().getIntExtra("position", -1);

            displayPDF();

        }




    }

    private void displayPDF() {
        pdfView.fromFile(MainActivity.fileList.get(position))

                .enableSwipe(true)
                .enableAnnotationRendering(true)
                .scrollHandle(new DefaultScrollHandle(getActivity()))
                .load();




    }


    //El sistema lo llama cuando el fragmento debe diseñar su interfaz de usuario por primera vez.
    //A fin de diseñar una IU para tu fragmento, debes mostrar un View desde este
    // método, que será la raíz del diseño de tu fragmento. Puedes mostrar
    //un valor nulo si el fragmento no proporciona una IU.
    //En el onCreateView, siempre trata de manejar todas las tareas que pertenezcan a la creación de la vista,
    //asignar y cambiar sus
    //propiedades, llamar metodos que carguen los datos antes de crear la vista, etc... Esto hara que tu
    //codigo se vea mas ordenado

    @Override
    public View onCreateView(LayoutInflater inflater , ViewGroup container ,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);


        //ArrayList<String> data = new ArrayList<>();
        //data.add("Eder");
        //data.add("Viera");

        //ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                //getContext(),
                // android.R.layout.simple_list_item_1,
                // data
                // );

        // ListView lvdata = (ListView)view.findViewById(listappalhome);
        // lvdata.setAdapter(adapter);


        lv_pdf = view.findViewById((R.id.listappalhome));

        dir = new File(Environment.getExternalStorageDirectory().toString());



        lv_pdf.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, final View view,
                                    int position, long id) {

            }

        });

        //lv_pdf.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        // public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
        //Intent intent = new Intent(getActivity(), VerArchivosPDF.class);
                // add data to the intent...
        //startActivity(intent);
        //}
        //}  );

        permission_fn();




        return view;

    }



    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
        // TODO Add your menu entries here
        super.onCreateOptionsMenu(menu, inflater);
    }


    private void permission_fn() {


        if ((ContextCompat.checkSelfPermission((getActivity()).getApplication().getApplicationContext(),

                Manifest.permission.READ_EXTERNAL_STORAGE) !=PackageManager.PERMISSION_GRANTED)) {

            if ((ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                    Manifest.permission.READ_EXTERNAL_STORAGE))) {

            } else {

                int REQUEST_PERMISSION = 1;
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        REQUEST_PERMISSION);

            }

        } else {

            bolean_permission = true;
            getfile(dir);
            adaptadorPDF obj_adapter = new adaptadorPDF(getActivity().getApplicationContext() , fileList);
            lv_pdf.setAdapter(obj_adapter);

        }
    }

    private void getfile(File dir) {

        File[] listFile = dir.listFiles();

        if (listFile!=null && listFile.length >0) {

            for (File file : listFile) {

                if (file.isDirectory()) {

                    getfile(file);

                } else {

                    boolean booleanpdf = false;

                    if (file.getName().endsWith(".pdf")) {

                        for (int j = 0; j < fileList.size(); j++) {

                            if (fileList.get(j).getName().equals(file.getName())) {

                                booleanpdf = true;
                            }
                        }

                        if (booleanpdf) {

                            booleanpdf = false;
                        } else {

                            fileList.add(file);
                        }
                    }
                }
            }

        }
    }


    }

Просмотр классов PDF-файлов ------ для просмотра PDF-файлов

public class VerArchivosPDF extends AppCompatActivity{



    PDFView pdfView;
    int position = -1;



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

        pdfView = (PDFView) findViewById(R.id.pdfView);

        position = getIntent().getIntExtra("position", -1);

        displayPDF();



    }

    private void displayPDF() {

        //pdfView.fromFile(HomeFragment.fileList.get(position))

        //.enableSwipe(true)
        //.enableAnnotationRendering(true)
        //.scrollHandle(new DefaultScrollHandle(this))
        //.load();



    }
}

Основная деятельность

public class MainActivity extends AppCompatActivity  {

    private AppBarConfiguration mAppBarConfiguration;

    adaptadorPDF obj_adapter;
    public static int REQUEST_PERMISSION = 1;
    boolean bolean_permission;
    File dir;
    ListView lv_pdf;
    DrawerLayout drawer;


    public static ArrayList<File>
            fileList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);







        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        // SI TENGO EL AppBarConfiguration lo que me permite es siempre tener que presionar el menu para
        // ir a otro fragment, si no lo coloco me permite volver atras
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow, R.id.nav_scanqr, R.id.navfirmadigital,
                R.id.nav_tools, R.id.nav_share, R.id.nav_send)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.contenedor_fragmentos);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);


        //.......................funciona.......................
        // Agregar fragmento que queremos que se incie primero al ejecutar la aplicacion
        //  aqui es el Home Fragment
        //3.2 Agregar Fragment mediante programación

        //De esta manera podemos agregar un fragment a una activity en cualquier momento.

        //Simplemente indicaremos la id de una vista padre (ViewGroup) donde deberá colocarse el fragment.

        /*En este caso nuestra activity muestra por defecto un layout "mostrar_fragment_dos.xml" que contiene
        un ViewGroup, en este caso en un RelativeLayout que no muestra nada pero nos va a servir para agregar
        nuestro fragment en dicha vista padre.

        Lo primero que hacemos es crear una instancia de "FragmentManager" a través de su método "getSupportFragmentManaget()"
    (dicho método corresponde a la librería de compatibilidad v4). De esta manera estamos creando un objeto que nos servirá
        para manejar los fragmentos.

        A continuación creamos una instancia de "FragmentTransaction" para realizar la transacción de fragmentos. A través
        del método "beginTransaction()" indicamos que vamos a realizar una transacción de fragmentos.

                Lo siguiente es crear una instancia de nuestro "FragmentUNO" y añadirla a la transacción a través
        del método "add()" que nos pide como parámetros la id del ViewGroup o vista padre donde se colocara dicho fragmento
                (en este caso es la id del RelativeLayout que comentábamos antes) y como segundo parámetro nos pide
        la instancia del fragmento que se mostrara dicha vista.

                Para terminar la transacción siempre deberemos declarar el método "commit()"*/
        HomeFragment homeFragment = new HomeFragment();
        FragmentManager fragmentManager=getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.listappalhome, homeFragment).commit();

        //.............................................................funciona


    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        MenuItem item = menu.findItem(R.id.nav_busqueda);
        SearchView searchView = (SearchView) item.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.contenedor_fragmentos);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }



    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        drawer.closeDrawer(GravityCompat.START);

        int id = item.getItemId();


        FragmentManager fragmentManager=getSupportFragmentManager();

        if (id== R.id.nav_home){

            fragmentManager.beginTransaction().replace(R.id.contenedor_fragmentos, new HomeFragment()).commit();

        } else if (id == R.id.nav_gallery) {
            fragmentManager.beginTransaction().replace(R.id.contenedor_fragmentos, new GalleryFragment()).commit();

        } else if (id == R.id.nav_send) {
            fragmentManager.beginTransaction().replace(R.id.contenedor_fragmentos, new SendFragment()).commit();
        } else if (id == R.id.nav_slideshow) {
            fragmentManager.beginTransaction().replace(R.id.contenedor_fragmentos, new SlideshowFragment()).commit();
        } else if (id == R.id.nav_share) {
            fragmentManager.beginTransaction().replace(R.id.contenedor_fragmentos, new ShareFragment()).commit();
        } else if (id == R.id.nav_tools) {
            fragmentManager.beginTransaction().replace(R.id.contenedor_fragmentos, new ToolsFragment()).commit();

        } else if (id == R.id.nav_busqueda) {
            fragmentManager.beginTransaction().replace(R.id.contenedor_fragmentos, new BusquedaFragment()).commit();

        }

        return true;
    }

    //Éste método nos permitirá reemplazar los fragments que necesitemos. El código va en MainActivity.java

    private void changeFragment(Fragment fragment, MenuItem item){
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.contenedor_fragmentos, fragment)
                .commit();
        item.setChecked(true);
        getSupportActionBar().setTitle(item.getTitle());
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        //noinspection SimplifiableIfStatement
        if (id == R.id.listappalhome) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

Что я хочу, так это то, что когда я нажимаю, я открываю другой фрагмент или действие и показываю выбранный файл PDF, чего я никак не достигаю. Сначала я называю Намерение внутри фрагмента, что невозможно, но я пробовал его разными способами.

...