Хорошо, что я хочу, когда я нажимаю на элемент в моем списке, который у меня есть в моем домашнем фрагменте, открываю документ, и я могу читать его и прокручивать. Мне удалось показать мне все файлы 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, чего я никак не достигаю. Сначала я называю Намерение внутри фрагмента, что невозможно, но я пробовал его разными способами.