簡體   English   中英

在Android Studio中切換時,標簽無法正常工作

[英]Tabs not working properly when switching in android studio

我是原生Android開發的新手。 我正在使用android studio開發應用程序。 我正在使用tabbed-activity並使用3個選項卡。 所有3個選項卡都有單獨的classeslayouts ,並帶有以下名稱,如下圖所示。

在此處輸入圖片說明

類和布局的名稱與圖像中所示的相同。

我的標簽具有以下功能。

  1. 在第一個選項卡上,我實現了一個google map v2 ,該google map v2顯示了我當前的gps位置以及坐標和標記。
  2. 在第二個選項卡上,我實現了一個camera ,其中放置了一個按鈕和一個image view 按下按鈕,相機將顯示,當我拍照時,它會在圖像視圖中顯示我。 此圖像也保存到我的SD CARD
  3. 在第三個也是最后一個選項卡中,我添加了一個gird view ,該gird view將從SD CARD獲取這些圖像並將其顯示在網格上。

對於third tab我按照本教程進行操作 ,因此我分別制作了2個helper類和1個adapter類。 2個幫助器類分別為AppConstantUtils該適配器名為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 MRuben2112的建議,我將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM