0

こんにちは、私は現在Android デバイスの SD カードの特定のフォルダーにあるすべてのファイルを表示しようとしていますが、ListViewこれまでのところ運が悪く、nullpointer 例外でクラッシュするので、誰かライトを照らすことができるかどうか疑問に思っていました私の問題は私の活動とログキャットを以下に投稿し、感謝します。

アクティビティ

package com.mkyong.android;

import java.io.File;

import java.util.ArrayList;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.view.View;

public class ListMobileActivity extends ListActivity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.res);

    }
        public ArrayList<String> GetFiles(String DirectoryPath) {
            ArrayList<String> MyFiles = new ArrayList<String>();
            File f = new File(DirectoryPath);

            f.mkdirs();
            File[] files = f.listFiles();
            if (files.length == 0)
                return null;
            else {
                for (int i=0; i<files.length; i++) 
                    MyFiles.add(files[i].getName());
            }

            return MyFiles;
        }
        {
        ListView lv;
        ArrayList<String> FilesInFolder = GetFiles("/sdcard/RootBox");
        lv = (ListView)findViewById(R.id.listView1);

        lv.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, FilesInFolder));

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

             }
        });
    }




    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {

        //get selected items
        String selectedValue = (String) getListAdapter().getItem(position);
        Toast.makeText(this, selectedValue, Toast.LENGTH_SHORT).show();

    }

}

とlogcat

05-24 06:42:28.992: E/AndroidRuntime(796): FATAL EXCEPTION: main
05-24 06:42:28.992: E/AndroidRuntime(796): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mkyong.android/com.mkyong.android.ListMobileActivity}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
05-24 06:42:28.992: E/AndroidRuntime(796):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
05-24 06:42:28.992: E/AndroidRuntime(796):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
05-24 06:42:28.992: E/AndroidRuntime(796):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-24 06:42:28.992: E/AndroidRuntime(796):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
05-24 06:42:28.992: E/AndroidRuntime(796):  at android.os.Handler.dispatchMessage(Handler.java:99)
4

3 に答える 3

1

storage を読み取るために android マニフェストで許可を求めた場合、これが問題である可能性があります。

コードから、インスタンス ブロックでリスト ビューのインスタンスをクエリしているようです。これは、setContentView が呼び出される前に呼び出される場合があります。レイアウトが拡張された後、XML で UI コンポーネントをインスタンス化する必要があります。そうしないと、例外が発生します。

これを試して。

    public class ListMobileActivity extends ListActivity {

    ListView lv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.res);

        ArrayList<String> FilesInFolder = GetFiles("/sdcard/RootBox");
        lv = (ListView) findViewById(R.id.listView1);

        lv.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, FilesInFolder));

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                    int position, long id) {

            }
        });
    }

    public ArrayList<String> GetFiles(String DirectoryPath) {
        ArrayList<String> MyFiles = new ArrayList<String>();
        File f = new File(DirectoryPath);

        f.mkdirs();
        File[] files = f.listFiles();
        if (files.length == 0)
            return null;
        else {
            for (int i = 0; i < files.length; i++)
                MyFiles.add(files[i].getName());
        }

        return MyFiles;
    }

}

それはうまくいくはずです。

于 2013-05-24T06:41:29.003 に答える
0

ログのように:

ListMobileActivity}: java.lang.RuntimeException: コンテンツには、id 属性が「android.R.id.list」である ListView が必要です

ListView を作成するために ListActivity を拡張する場合は、xml の ListView id を「android.R.id.list」に設定する必要があります。レイアウトとしてそれを行いresます:

<ListView android:id="@id/android:list" <!--set ListView id to android.R.id.list-->
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="false"
        android:scrollbars="vertical"/>

コードで ListView インスタンスを次のように初期化します。

lv = (ListView)findViewById(android.R.id.list);

また

lv =ListMobileActivity.this.getListView();
于 2013-05-24T06:41:39.183 に答える
0

これを試して:

package com.mkyong.android;

import java.io.File;

import java.util.ArrayList;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.view.View;

public class ListMobileActivity extends ListActivity {

    ListView lv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.res);

        ArrayList<String> FilesInFolder = GetFiles("/sdcard/RootBox");

        setListAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, FilesInFolder));
    }

    public ArrayList<String> GetFiles(String DirectoryPath) {
        ArrayList<String> MyFiles = new ArrayList<String>();
        File f = new File(DirectoryPath);

        f.mkdirs();
        File[] files = f.listFiles();
        if (files.length == 0)
            return null;
        else {
            for (int i=0; i<files.length; i++){
                MyFiles.add(files[i].getName());
            }
        }

        return MyFiles;
    }    

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {

        //get selected items
        String selectedValue = (String) getListAdapter().getItem(position);
        Toast.makeText(this, selectedValue, Toast.LENGTH_SHORT).show();

    }

}
于 2013-05-24T06:49:28.093 に答える