[英]Tabs not working properly when switching in android studio
我是原生Android開發的新手。 我正在使用android studio
開發應用程序。 我正在使用tabbed-activity
並使用3個選項卡。 所有3個選項卡都有單獨的classes
和layouts
,並帶有以下名稱,如下圖所示。
類和布局的名稱與圖像中所示的相同。
我的標簽具有以下功能。
google map v2
,該google map v2
顯示了我當前的gps位置以及坐標和標記。 camera
,其中放置了一個按鈕和一個image view
。 按下按鈕,相機將顯示,當我拍照時,它會在圖像視圖中顯示我。 此圖像也保存到我的SD CARD
。 gird view
,該gird view
將從SD CARD
獲取這些圖像並將其顯示在網格上。 對於third tab
我按照本教程進行操作 ,因此我分別制作了2個helper
類和1個adapter
類。 2個幫助器類分別為AppConstant
和Utils
該適配器名為GridViewImageAdapter
,它擴展了BaseAdapter
。
以上所有3個類(2個輔助對象和1個適配器)都導入了我的pictures
類。
現在,當我第一次運行該應用程序時,我可以看到我的當前位置。 但是,當我點擊“ camera
選項卡時,它將進入“ Util
類,當它找不到任何文件時,應用程序將崩潰。 這不會發生,因為我的Util類僅導入到pictures
片段中,與camera
片段無關。 以下是代碼部分
Camera.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.camera, container, false);
button = (Button)rootView.findViewById(R.id.getpicture);
imageView = (ImageView)rootView.findViewById(R.id.imageView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Check permission for CAMERA
if (ActivityCompat.checkSelfPermission(getActivity(), CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Check Permissions Now
// Callback onRequestPermissionsResult interceptado na Activity MainActivity
ActivityCompat.requestPermissions(getActivity(),
new String[]{CAMERA},
Camera.REQUEST_CAMERA);
}
else {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE );
}
}
});
return rootView;
}
//For saving image(s)
private void SaveImage(Bitmap finalBitmap) {
String root = Environment.getExternalStorageDirectory().getAbsolutePath().toString();
Log.v(getTag(), root);
File myDir = new File(root + "/saved_images");
myDir.mkdirs();
Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
String fname = "Image-" + n + ".jpg";
File file = new File(myDir,fname);
if (file.exists())file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG,90,out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
//Toast.makeText(getContext(), "Image is saved", Toast.LENGTH_LONG).show();
}
以下是我的圖片代碼
Pictures.java
import com.example.accurat.faisal.adapter.GridViewImageAdapter;
import com.example.accurat.faisal.helper.Utils;
import com.example.accurat.faisal.helper.AppConstant;
//other imports
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.pictures, container, false);
gridView = (GridView)rootView.findViewById(R.id.grid_view);
utils = new Utils(getContext());
// Initilizing Grid View
InitilizeGridLayout();
// loading all image paths from SD card
imagePaths = utils.getFilePaths();
// Gridview adapter
adapter = new GridViewImageAdapter(getActivity(), imagePaths, columnWidth);
/*adapter = new GridViewImageAdapter(Pictures.this, imagePaths,
columnWidth);*/
// setting grid view adapter
gridView.setAdapter(adapter);
return rootView;
}
private void InitilizeGridLayout() {
Resources r = getResources();
float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
AppConstant.GRID_PADDING, r.getDisplayMetrics());
columnWidth = (int) ((utils.getScreenWidth() - ((AppConstant.NUM_OF_COLUMNS + 1) * padding)) / AppConstant.NUM_OF_COLUMNS);
gridView.setNumColumns(AppConstant.NUM_OF_COLUMNS);
gridView.setColumnWidth(columnWidth);
gridView.setStretchMode(GridView.NO_STRETCH);
gridView.setPadding((int) padding, (int) padding, (int) padding,
(int) padding);
gridView.setHorizontalSpacing((int) padding);
gridView.setVerticalSpacing((int) padding);
}
上面的此類將訪問helper
方法和adapter
方法。 參見下面的幫助方法
Utils.java
public class Utils {
// Reading file paths from SDCard
public ArrayList<String> getFilePaths() {
ArrayList<String> filePaths = new ArrayList<String>();
File directory = new File(
android.os.Environment.getExternalStorageDirectory(),AppConstant.PHOTO_ALBUM);
// check for directory
if (directory.isDirectory()) {
// getting list of file paths
File[] listFiles = directory.listFiles();
// Check for count
if (listFiles.length > 0) {
// loop through all files
for (int i = 0; i < listFiles.length; i++) {
// get file path
String filePath = listFiles[i].getAbsolutePath();
// check for supported file extension
if (IsSupportedFile(filePath)) {
// Add image path to array list
filePaths.add(filePath);
}
}
} else {
// image directory is empty
Toast.makeText(
_context,
AppConstant.PHOTO_ALBUM
+ " is empty. Please load some images in it !",
Toast.LENGTH_LONG).show();
}
} else {
AlertDialog.Builder alert = new AlertDialog.Builder(_context);
alert.setTitle("Error!");
alert.setMessage(AppConstant.PHOTO_ALBUM
+ " directory path is not valid! Please set the image directory name AppConstant.java class");
alert.setPositiveButton("OK", null);
alert.show();
}
return filePaths;
}
}
此類中還有其他方法,但是我只發布了上面的方法,因為當我轉到“ pictures
選項卡時,此方法首先被調用,並且它適用於“圖片”選項卡,但是當我再次轉到“ camera
選項卡時,上述方法被稱為之所以應該調用它,是因為我的相機類中沒有任何東西可以訪問助手類。 我不知道為什么會發生這種情況,因為所有類都是單獨的,所以它不應該這樣工作,並且我得到了null exception
清單見下文
<uses-permission android:name="com.example.accurat.faisal.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
下面是錯誤
FATAL EXCEPTION: main
Process: com.example.accurat.faisal, PID: 25624
java.lang.NullPointerException: Attempt to get length of null array
at com.example.accurat.faisal.helper.Utils.getFilePaths(Utils.java:42)
at com.example.accurat.faisal.Pictures.onCreateView(Pictures.java:45)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2184)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298)
at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092)
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1969)
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1268)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:668)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:630)
at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:611)
at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2178)
at android.support.design.widget.TabLayout.dispatchTabSelected(TabLayout.java:1155)
at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1148)
at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1118)
at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1413)
at android.support.design.widget.TabLayout$TabView.performClick(TabLayout.java:1523)
at android.view.View$PerformClick.run(View.java:22596)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Utlis.java:42
是
// check for directory
if (directory.isDirectory()) {
// getting list of file paths
File[] listFiles = directory.listFiles();
// Check for count
if (listFiles.length > 0) {// do the needful
雖然Pictures.java:42
// loading all image paths from SD card imagePaths = utils.getFilePaths();
更新1
根據Mike M
和Ruben2112
的建議,我將READ_EXTERNAL_STORAGE
導入到我的每個幫助器和適配器類中,並且還在Utils
類中放置了對listFiles
的檢查,如下所示
File directory = new File(
android.os.Environment.getExternalStorageDirectory(),AppConstant.PHOTO_ALBUM);
// check for directory
if (directory.isDirectory()) {
// getting list of file paths
File[] listFiles = directory.listFiles();
if (listFiles != null) {// Check for list files
// Check for count
if (listFiles.length > 0) {
// loop through all files
for (int i = 0; i < listFiles.length; i++) {
// get file path
String filePath = listFiles[i].getAbsolutePath();
// check for supported file extension
if (IsSupportedFile(filePath)) {
// Add image path to array list
filePaths.add(filePath);
}
}
} else {
// image directory is empty
Toast.makeText(
_context,
AppConstant.PHOTO_ALBUM
+ " is empty. Please load some images in it !",
Toast.LENGTH_LONG).show();
}
} else {
AlertDialog.Builder alert = new AlertDialog.Builder(_context);
alert.setTitle("Error!");
alert.setMessage(AppConstant.PHOTO_ALBUM
+ " directory path is not valid! Please set the image directory name AppConstant.java class");
alert.setPositiveButton("OK", null);
alert.show();
}
}
現在我的應用程序沒有崩潰,但仍然在警報框中顯示錯誤,如下圖所示
點擊確定后,應用仍然運行
我堅持下去,不知道該怎么辦。 任何幫助將不勝感激。
這不會發生,因為我的Util類僅導入到圖片片段中,與相機片段無關。
使用選項卡時要意識到的重要一點是,直接打開的選項卡旁邊的選項卡也已加載。這是因為該選項卡已經加載,因此過渡更加順暢,這就是可以滑動到的方式下一個標簽。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.