从Fragment完成一项活动

时间:2012-11-30 10:19:33

标签: android android-asynctask android-fragments

在我的应用程序中,我有2个片段,Fragment A和Fragment B.在这两个片段中我做了一些XML解析和填充listviews。我想为我的app实现一个启动画面。所以它在解析和填充期间显示列表视图和完成时完成。为此,我创建了一个SplashActivity活动。我已经在FragmentA上实现了asyntask并在preexecute部分调用了SplashActivity。现在,当应用启动SplashActivity时,我开始了。但是我无法在FragmentA的postexecute上完成这个活动。 getActivity()。finishActivity()不起作用。请帮助我解决这个问题,或者建议我在Fragment Activity上实现Splash屏幕的另一种方法。提前谢谢....

这是我的FragmentA =>

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflating layout
        View v = inflater
                .inflate(R.layout.headlines_fragment, container, false);

        return v;

    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

        super.onViewCreated(view, savedInstanceState);
        Log.i("Tag", "onCreateView");

        // We set clear listener
        loading = (ProgressBar) getActivity().findViewById(R.id.progressBar1);

        if (Headlines.headflag == "malayalam") {
            urls = "http://www.abc.com/rssfeeds/19_18_17_25/1/rss.xml";

        }

        if (Headlines.headflag == "english") {
            urls = "http://www.abc.com/en/rssfeeds/1_2_3_5/latest/rss.xml";

        }

        new ProgressAsyncTask().execute();

        MainActivity.refresh.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                new ProgressAsyncTask().execute();

            }
        });

    }

    public void populate_listview() {

        newsList = new ArrayList<HashMap<String, String>>();

        // looping through all song nodes <song>

        for (int i = 0; i < nl.getLength(); i++) {
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            Element e = (Element) nl.item(i);
            newsList.add(map);
            MarqueeStr = MarqueeStr + " *** " + Title[i];

        }

    }

    public void StartProgress() {
        new ProgressAsyncTask().execute();
    }

    public class ProgressAsyncTask extends AsyncTask<Void, Integer, Void> {

        int myProgress;

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            myProgress = 0;

            Intent intent = new Intent(getActivity(), Splash.class);
            startActivityForResult(intent, 5); //Here I called Splash Activity

            loading.setVisibility(View.VISIBLE);

        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);

            getActivity().finishActivity(5);// Here I tried to finish flash activity

            if (Title == null) {

                final AlertDialog.Builder alertbox = new AlertDialog.Builder(
                        getActivity());

                alertbox.setMessage("Error in connection.Do you want to retry");
                alertbox.setPositiveButton("retry",
                        new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface arg0, int arg1) {
                                // getActivity().finish();
                                // Intent intent = new Intent(getActivity(),
                                // MainActivity.class);
                                // startActivityForResult(intent,1);

                            }

                        });

                alertbox.setNegativeButton("exit",
                        new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface arg0, int arg1) {

                                // getActivity().finish();

                            }

                        });

                alertbox.show();

            }

            list = (GridView) getActivity().findViewById(R.id.grid);

            // Getting adapter by passing xml data ArrayList
            adapter = new HeadlinesAdapter(getActivity(), newsList);
            list.setAdapter(adapter);
            loading.setVisibility(View.INVISIBLE);
            Typeface tf = Typeface.createFromAsset(getActivity().getAssets(),
                    "fonts/karthika.TTF");
            MainActivity.flashnews.setText(MarqueeStr);
            if (Headlines.headflag == "malayalam") {
                MainActivity.flashnews.setTypeface(tf);

            }
            list.setOnItemClickListener(new OnItemClickListener() {

                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {

                    Intent myintent = new Intent(
                            "com.abc.malayalam2headlinespodcast.PODCAST");
                    Bundle mybundle = new Bundle();
                    mybundle.putInt("number", position);
                    myintent.putExtras(mybundle);

                    startActivity(myintent);

                }
            });

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            // TODO Auto-generated method stub
            parse();

            if (Title != null) {
                populate_listview();
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub

        }

    }

    public static void parse() {

           //parsing done here
    }

}

2 个答案:

答案 0 :(得分:4)

您不应该将您的Splash实现为Activity,而应该DialogFragment。只需设置该对话框片段的样式,使其显示为全屏。

关于显示:

SplashDialogFragment splashDlg = new SplashDialogFragment();
splashDlg.show(getSupportFragmentManager(), "SplashScreen");

然后关闭:

SplashDialogFragment splashDlg = (SplashDialogFragment) getSupportFragmentManager().findByTag("SplashScreen");
splashDlg.dismiss();

答案 1 :(得分:1)

只是回答问题实际上是你的标题&#34;要从Fragment&#34;完成一项活动,它总是使用界面根据文档从Fragment到Activity进行交互的好方法: Communicating with Activity from Fragment。因此,必须始终在Fragment中声明一个接口,该接口将在您的活动中实现,如下所示:

public class SplashActivity extends Activity implements FragmentA.FragmentListenerCallback {

   public void onFragmentInteraction() {
       //finish your activity or do whatever you like
       finish();
   }       
}

public class FragmentA extends Fragment {
   private FragmentListenerCallback fragmentListenerCallback;

   @Override
   public void onAttach(Activity activity) {
     super.onAttach(activity);
     fragmentListenerCallback = (FragmentListenerCallback) activity;
   }

   public interface FragmentListenerCallback {
       void onFragmentInteraction();
   }

   @Override
   protected void onPostExecute(Void result) {
       // TODO Auto-generated method stub
       super.onPostExecute(result);
       if(fragmentListenerCallback != null){
            fragmentListenerCallback.onFragmentInteraction();
       }
   }
}