3

MainActivity2つのタブがあるがありますActionBar。そのアクティビティの私のメインレイアウトは空FrameLayoutです。最初のタブにはが含まれProgressBar、2番目のタブにはButtonファイルのダウンロードが開始されます。ここにありSettingsTabます:

public class SettingsTab extends Fragment {
    private Button downloadButton;
    private ImagesTab imagesTab;
    private static String fileDir = "sdcard/AndroidCourse/";
    public void downloadImages(String url,int limit,String imageExtension)
    {

        try {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectAll()
            .build());
            Document doc = Jsoup.connect(url).get();
            StringBuilder sb = new StringBuilder("img[src$=.");
            sb.append(imageExtension);
            sb.append("]");
            Elements images = doc.select(sb.toString());
            ArrayList<String> urls = new ArrayList<String>();
            for(Element image : images) {
                if(urls.size() == limit) {  
                    break;
                }
                urls.add(image.attr("src"));
            }
            Log.e("urls", String.valueOf(urls.size()));
            imagesTab.downloadStarted(urls);


        } catch (IOException e) {
            Log.e("SettingsTab", e.getMessage());
        }
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.settings_tab, null);
        downloadButton = (Button) view.findViewById(R.id.startButton);
        imagesTab = new ImagesTab();
        downloadButton.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                downloadImages("http://www.google.com",5,"jpg");


            }

        });
        return view;

    }
}

およびImagesTab

public class ImagesTab extends Fragment {
    ProgressBar downloadProgressBar;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.images_tab, null);
        downloadProgressBar = (ProgressBar) view.findViewById(R.id.downloadProgressBar);
        //downloadProgressBar.setVisibility(View.INVISIBLE);

        return view;

    }
    public void downloadStarted(ArrayList<String> urls)
    {
        //downloadProgressBar.setVisibility(View.VISIBLE);
        Intent intent = new Intent(getActivity(), DownloadService.class);
        intent.putExtra("urls", urls);
        intent.putExtra("receiver", new DownloadReceiver(new Handler()));
        getActivity().startService(intent);
        Toast.makeText(getActivity(), "Service started!" + urls.size(), Toast.LENGTH_SHORT).show();
    }
    private class DownloadReceiver extends ResultReceiver{
        public DownloadReceiver(Handler handler) {
            super(handler);
        }

        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            super.onReceiveResult(resultCode, resultData);
            if (resultCode == DownloadService.UPDATE_PROGRESS) {
                int progress = resultData.getInt("progress");
                downloadProgressBar.setProgress(progress);
                if (progress == 100) {
                    downloadProgressBar.setVisibility(View.INVISIBLE);
                }
            }
        }
    }
}

StartDownload をクリックするButtonと、次の例外を除いてアプリケーションがクラッシュします。

11-26 03:55:55.765: E/AndroidRuntime(21200): FATAL EXCEPTION: main
11-26 03:55:55.765: E/AndroidRuntime(21200): java.lang.NullPointerException
11-26 03:55:55.765: E/AndroidRuntime(21200):    at android.content.ComponentName.<init>(ComponentName.java:75)
11-26 03:55:55.765: E/AndroidRuntime(21200):    at android.content.Intent.<init>(Intent.java:3227)
11-26 03:55:55.765: E/AndroidRuntime(21200):    at com.example.lista2.ImagesTab.downloadStarted(ImagesTab.java:32)
11-26 03:55:55.765: E/AndroidRuntime(21200):    at com.example.lista2.SettingsTab.downloadImages(SettingsTab.java:55)
11-26 03:55:55.765: E/AndroidRuntime(21200):    at com.example.lista2.SettingsTab$1.onClick(SettingsTab.java:72)

誰かがProgressBarアプリの別の部分での進行状況を変更する方法を知っていますか?

4

1 に答える 1

1

コードの主な問題とその理由NullPointerExceptionは次のとおりです。

imagesTab = new ImagesTab();

新しいをインスタンス化する場所ImagesTab Fragment。問題は、この新しいインスタンスが(「空中」にある)にFragment関連付けられていないため、そのメソッドがを返すことです。渡すメソッドから、をスローするメソッドでビルドするメソッドへのこの値。のようにインスタンス化する代わりに、を使用してそのタグに基づいてフラグメントを検索することにより、親アクティビティにすでに(ほとんどの場合)存在する他のフラグメントへの参照を取得する必要があります。ActivitygetActivity()nullnullgetActivity()IntentdownloadStarted()NulPointerExceptionImgesTabgetFragmentManager()

第二に、更新はProgressBarアプリの設計上の問題のようです。たとえば、Buttonあるタブでダウンロードを開始しProgressBar、別のタブでダウンロードの進行状況を表示するがなぜあるのでしょうか。また、ダウンロードにを使用しているように見えるので、タブを通信させるのではなく、ファイルをダウンロードするタブと目的のタブフラグメント(を使用して)Serviceを実際に通信させる必要があります。これは、特定のダウンロードレベルで送信ブロードキャストを作成し、(2つのタブフラグメントを保持する)を動的に登録することにより、非常に簡単にすることができます。送信がブロードキャストを送信すると(たとえば10%)、'sはそれをピックアップし(生きている場合)、次に更新します。ServiceProgressBarServiceActivityBroadcastReceiverServiceActivityBroadcastReceiverProgressBarそれがその瞬間に見えるFragment場合は、希望から​​。Fragment

于 2012-11-26T15:08:27.937 に答える