1

I need to launch List_activity from Second_frag but I'm getting an error. Here are my codes

public class Second_frag extends android.support.v4.app.Fragment {

String RSSFEEDURL = "http://feeds.feedburner.com/TwitterRssFeedXML?format=xml";
RSSFeed feed;
String fileName;

View myView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    myView = inflater.inflate(R.layout.splash,container,false);


    fileName = "TDRSSFeed.td";

    File feedFile = getActivity().getBaseContext().getFileStreamPath(fileName);

    ConnectivityManager conMgr = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
    if (conMgr.getActiveNetworkInfo() == null) {

        // No connectivity. Check if feed File exists
        if (!feedFile.exists()) {

            // No connectivity & Feed file doesn't exist: Show alert to exit
            // & check for connectivity
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setMessage(
                    "Unable to reach server, \nPlease check your connectivity.")
                    .setTitle("TD RSS Reader")
                    .setCancelable(false)
                    .setPositiveButton("Exit",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog,
                                                    int id) {
                                    getActivity().finish();
                                }
                            });

            AlertDialog alert = builder.create();
            alert.show();
        } else {

            // No connectivty and file exists: Read feed from the File
            Toast.makeText(Second_frag.this.getActivity(), "No connectivity. Reading last update", Toast.LENGTH_LONG).show();
            feed = ReadFeed(fileName);
            startLisActivity(feed);
        }

    } else {

        // Connected - Start parsing
        new AsyncLoadXMLFeed().execute();

    }
    return myView;


}

private void startLisActivity(RSSFeed feed) {

    Bundle bundle = new Bundle();
    bundle.putSerializable("feed", feed);

    // launch List activity
    Intent intent = new Intent(getActivity(), List_Activity.class);

    intent.putExtras(bundle);
    startActivity(intent);

    // kill this activity
    getActivity().finish();

}

private class AsyncLoadXMLFeed extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {

        // Obtain feed
        DOMParser myParser = new DOMParser();
        feed = myParser.parseXml(RSSFEEDURL);
        if (feed != null && feed.getItemCount() > 0)
            WriteFeed(feed);
        return null;

    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        startLisActivity(feed);
    }

}

// Method to write the feed to the File
private void WriteFeed(RSSFeed data) {

    FileOutputStream fOut = null;
    ObjectOutputStream osw = null;

    try {
        fOut = getActivity().openFileOutput(fileName, Context.MODE_PRIVATE);
        osw = new ObjectOutputStream(fOut);
        osw.writeObject(data);
        osw.flush();
    }

    catch (Exception e) {
        e.printStackTrace();
    }

    finally {
        try {
            fOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// Method to read the feed from the File
private RSSFeed ReadFeed(String fName) {

    FileInputStream fIn = null;
    ObjectInputStream isr = null;

    RSSFeed _feed = null;
    File feedFile = getActivity().getBaseContext().getFileStreamPath(fileName);
    if (!feedFile.exists())
        return null;

    try {
        fIn = getActivity().openFileInput(fName);
        isr = new ObjectInputStream(fIn);

        _feed = (RSSFeed) isr.readObject();
    }

    catch (Exception e) {
        e.printStackTrace();
    }

    finally {
        try {
            fIn.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return _feed;

}



}

list_activity

 public class List_Activity extends Fragment {

Application myApp;
RSSFeed feed;
ListView lv;
CustomListAdapter adapter;

View myView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    myView = inflater.inflate(R.layout.feed_list, container, false);


    myApp = getActivity().getApplication();

// Get feed form the file
    feed = (RSSFeed) getActivity().getIntent().getExtras().get("feed");

// Initialize the variables:
    lv = (ListView) getView().findViewById(R.id.listView);
    lv.setVerticalFadingEdgeEnabled(true);

// Set an Adapter to the ListView
    adapter = new CustomListAdapter(this);
    lv.setAdapter(adapter);

// Set on item click listener to the ListView
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView arg0, View arg1, int arg2,
                                long arg3) {
// actions to be performed when a list item clicked
            int pos = arg2;

            Bundle bundle = new Bundle();
            bundle.putSerializable("feed", feed);
            Intent intent = new Intent(getActivity(),
                    DetailActivity.class);
            intent.putExtras(bundle);
            intent.putExtra("pos", pos);
            startActivity(intent);

        }
    });
    return myView;
}

@Override
public void onDestroy() {
    super.onDestroy();
    adapter.imageLoader.clearCache();
    adapter.notifyDataSetChanged();
}

class CustomListAdapter extends BaseAdapter {

    private LayoutInflater layoutInflater;
    public ImageLoader imageLoader;

    public CustomListAdapter(List_Activity activity) {

        layoutInflater = (LayoutInflater) activity
                .getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getActivity());
    }

    @Override
    public int getCount() {

// Set the total list item count
        return feed.getItemCount();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

 // Inflate the item layout and set the views
        View listItem = convertView;
        int pos = position;
        if (listItem == null) {
            listItem = layoutInflater.inflate(R.layout.list_item, null);
        }

  // Initialize the views in the layout
        ImageView iv = (ImageView) listItem.findViewById(R.id.thumb);
        TextView tvTitle = (TextView) listItem.findViewById(R.id.title);
        TextView tvDate = (TextView) listItem.findViewById(R.id.date);

 // Set the views in the layout
        imageLoader.DisplayImage(feed.getItem(pos).getImage(), iv);
        tvTitle.setText(feed.getItem(pos).getTitle());
        tvDate.setText(feed.getItem(pos).getDate());

        return listItem;
    }
}
}

logcat

 09-07 10:38:30.836  24588-24588/com.example.samsung.drawer E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.samsung.drawer, PID: 24588
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.samsung.drawer/com.example.samsung.drawer.List_Activity}: java.lang.ClassCastException: com.example.samsung.drawer.List_Activity cannot be cast to android.app.Activity
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2225)
            at     android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396)
            at android.app.ActivityThread.access$800(ActivityThread.java:139)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:149)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
            at dalvik.system.NativeStart.main(Native Method)
         Caused by: java.lang.ClassCastException: com.example.samsung.drawer.List_Activity cannot be cast to android.app.Activity
            at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2216)
            at         android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396)
            at android.app.ActivityThread.access$800(ActivityThread.java:139)
            at     android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:149)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at     com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
            at dalvik.system.NativeStart.main(Native Method)

RSSFeed.Java

import java.io.Serializable;
import java.util.List;
import java.util.Vector;

public class RSSFeed implements Serializable {

    private static final long serialVersionUID = 1L;
    private int _itemcount = 0;
    private List<RSSItem> _itemlist;

    RSSFeed() {
        _itemlist = new Vector<RSSItem>(0);
    }

    void addItem(RSSItem item) {
        _itemlist.add(item);
        _itemcount++;
    }

    public RSSItem getItem(int location) {
        return _itemlist.get(location);
    }

    public int getItemCount() {
        return _itemcount;
    }

}

RSSItem.Java

package com.example.samsung.drawer;

import java.io.Serializable;

public class RSSItem implements Serializable {

    private static final long serialVersionUID = 1L;
    private String _title = null;
    private String _description = null;
    private String _date = null;
    private String _image = null;

    void setTitle(String title) {
        _title = title;
    }

    void setDescription(String description) {
        _description = description;
    }

    void setDate(String pubdate) {
        _date = pubdate;
    }

    void setImage(String image) {
        _image = image;
    }

    public String getTitle() {
        return _title;
    }

    public String getDescription() {
        return _description;
    }

    public String getDate() {
        return _date;
    }

    public String getImage() {
        return _image;
    }

}

could anyone please show me how to solve this?

NewGuy117
  • 89
  • 1
  • 3
  • 10

5 Answers5

3

List_Activity is a Fragment. You cannot use

Intent intent = new Intent(getActivity(), List_Activity.class);

intent.putExtras(bundle);
startActivity(intent);

You can use a interface as a callback to the hosting activity. Then pass data to List_Activity Fragment from activity.

Also you would probably want to pass a context to the adapter custructor

http://developer.android.com/training/basics/fragments/communicating.html

Raghunandan
  • 132,755
  • 26
  • 225
  • 256
  • But OP can also pass data using `set setArguments(bundle)` method and OP also need add Fragment to Activity using FragmentManager instead of starting as Activity – ρяσѕρєя K Sep 07 '15 at 03:21
  • @ρяσѕρєяK yes he can. But its Fragment to Fragment communication and i suggested it can be done with the hosting activity. – Raghunandan Sep 07 '15 at 05:42
  • I forgot to mention that fragment needs to be attached to the activity. – Raghunandan Sep 07 '15 at 05:49
1

Try this method

private void startLisActivity(RSSFeed feed) {
    Bundle bundle = new Bundle();
    bundle.putSerializable("feed", feed);
    List_Activity fragment = new List_Activity();
    fragment.setArguments(bundle);
    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.frame_container, fragment).commit();
    getActivity().finish();
}

Where frame_container is id of your FrameLayout in which you are replacing Fragment. I hope it helps!

Rajesh Jadav
  • 12,801
  • 5
  • 53
  • 78
0

List_Activity is a Fragment not Activity, you cannot start it with startActivity

If you want to replace the current Fragment, use FragmentManager

Derek Fung
  • 8,171
  • 1
  • 25
  • 28
0

If this two fragments are attached in a Activity, you can communitcate between two fragments through activity. At each fragment, you use onActivityCreated function to call function of Activity that define action to transit to other fragment. Please refer here [Replacing a fragment with another fragment inside activity group

Community
  • 1
  • 1
MinhDev
  • 11
  • 7
  • tried this but I'm getting an error in logcat saying `No view found for id 0x7f0e0073 (com.example.samsung.drawer:id/feed_list) for fragment List_Activity{21f7eb38 #2 id=0x7f0e0073}` – NewGuy117 Sep 07 '15 at 03:26
  • I'm not clear about your error, but you can search on Stackoverflow with same error. Please trying searching before you give a question. – MinhDev Sep 07 '15 at 03:37
  • I searched: [http://stackoverflow.com/questions/7508044/android-fragment-no-view-found-for-id] – MinhDev Sep 07 '15 at 03:37
-1

It's not a good practice to directly communicate between fragments, you should communicate between them only through an activity using the Interface design pattern. Here is a link from one of my earlier post describing how you can achieve it.

Community
  • 1
  • 1
Kaveesh Kanwal
  • 1,753
  • 17
  • 16