0

So I am trying to pickup Java and especially Android programming. But I am pretty new to this so please have patience :-) This is probably very simple for you Android and Java experts.

What I want to accomplish is loop through all of my friends and create a button for each one of them. The looping part works, the creating of a button does not. You can see in the code what I already tried. The facebook example is using two Activities: MainActivity, PickerActivity and two Fragments: SplashFragment, SelectFragment. I have a a layout for the each Activity and each Fragment. I want to place the button on the selection.xml layout but I am not sure on how to do it. I hope I made myself clear :-)

What I did is, use the facebook sdk and the Scrumptious example I am trying to enhance the friendpicker. The example and especially the friendpicker already works. It shows all my friends I can select them and upon clicking okay I can get them using friendPickerFragment.getSelection();

code from PickerActivity.java:

friendPickerFragment.setOnDoneButtonClickedListener(
        new PickerFragment.OnDoneButtonClickedListener() {
    @Override
    public void onDoneButtonClicked(PickerFragment<?> fragment) {

    //here I am getting the selected facebook user
        List<GraphUser> FriendListToPlay = friendPickerFragment.getSelection();

        for (GraphUser User: FriendListToPlay) {
            Log.i("info",User.getId()+' '+User.getName());

            /* create button for every facebook user chosen
            Button myButton = new Button(PickerActivity.this);
            myButton.setText(User.getName() + " waiting for game");

            LinearLayout ll = (LinearLayout)findViewById(R.id.linear_view);
            LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            ll.addView(myButton, lp);
            */
        }

        finishActivity();
    }
});

SelectionFragment: public class SelectionFragment extends Fragment {

public static String OwnId = "";
public static GraphUser OwnUser = null;

private static final String TAG = "SelectionFragment";  

private static final int REAUTH_ACTIVITY_CODE = 100;

private ProfilePictureView profilePictureView;
private TextView userNameView;

private ListView listView;
private List<BaseListElement> listElements; 

private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(final Session session, final SessionState state, final Exception exception) {
        onSessionStateChange(session, state, exception);
    }
};  

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    uiHelper = new UiLifecycleHelper(getActivity(), callback);
    uiHelper.onCreate(savedInstanceState);
}   

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

 // Find the user's profile picture custom view
    profilePictureView = (ProfilePictureView) view.findViewById(R.id.selection_profile_pic);
    profilePictureView.setCropped(true);

    // Find the user's name view
    userNameView = (TextView) view.findViewById(R.id.selection_user_name);      

 // Find the list view
    listView = (ListView) view.findViewById(R.id.selection_list);

    // Set up the list view items, based on a list of
    // BaseListElement items
    listElements = new ArrayList<BaseListElement>();
    // Add an item for the friend picker
    listElements.add(new PeopleListElement(0));
    // Set the list view adapter
    listView.setAdapter(new ActionListAdapter(getActivity(), 
                        R.id.selection_list, listElements));

    // Check for an open session
    Session session = Session.getActiveSession();       

    if (session != null && session.isOpened()) {
        // Get the user's data
        makeMeRequest(session);
    }


    return view; 
}   

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REAUTH_ACTIVITY_CODE) {
      uiHelper.onActivityResult(requestCode, resultCode, data);

    } else if (resultCode == Activity.RESULT_OK) {
        // Do nothing for now
    }
}

private void makeMeRequest(final Session session) {
    // Make an API call to get user data and define a 
    // new callback to handle the response.
    Request request = Request.newMeRequest(session, new Request.GraphUserCallback() {
        @Override
        public void onCompleted(GraphUser user, Response response) {
            // If the response is successful
            if (session == Session.getActiveSession()) {
                if (user != null) {
                    // Set the id for the ProfilePictureView
                    // view that in turn displays the profile picture.
                    profilePictureView.setProfileId(user.getId());
                    // Set the Textview's text to the user's name.
                    userNameView.setText(user.getName());

                    OwnId = user.getId();
                    OwnUser = user;

                    //ServiceAsyncTask task = new ServiceAsyncTask();
                    //task.run();
                }
            }
            if (response.getError() != null) {
                // Handle errors, will do so later.
            }
        }
    });
    request.executeAsync();
} 

private void onSessionStateChange(final Session session, SessionState state, Exception exception) {
    if (session != null && session.isOpened()) {
        // Get the user's data.
        makeMeRequest(session);
    }
}   

@Override
public void onResume() {
    super.onResume();
    uiHelper.onResume();
}

@Override
public void onSaveInstanceState(Bundle bundle) {
    super.onSaveInstanceState(bundle);
    uiHelper.onSaveInstanceState(bundle);
}

@Override
public void onPause() {
    super.onPause();
    uiHelper.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}   

private class PeopleListElement extends BaseListElement {

    public PeopleListElement(int requestCode) {
        super(getActivity().getResources().getDrawable(R.drawable.action_people),
              getActivity().getResources().getString(R.string.action_people),
              getActivity().getResources().getString(R.string.action_people_default),
              requestCode);
    }

    @Override
    protected View.OnClickListener getOnClickListener() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                startPickerActivity(PickerActivity.FRIEND_PICKER, getRequestCode());
            }
        };
    }

    @Override
    protected void populateOGAction(OpenGraphAction action) {
        // TODO Auto-generated method stub

    }
}   

private class ActionListAdapter extends ArrayAdapter<BaseListElement> {
    private List<BaseListElement> listElements;

    public ActionListAdapter(Context context, int resourceId, List<BaseListElement> listElements) {
        super(context, resourceId, listElements);
        this.listElements = listElements;
        for (int i = 0; i < listElements.size(); i++) {
            listElements.get(i).setAdapter(this);
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            LayoutInflater inflater =
                    (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.listitem, null);
        }

        BaseListElement listElement = listElements.get(position);
        if (listElement != null) {
            view.setOnClickListener(listElement.getOnClickListener());
            ImageView icon = (ImageView) view.findViewById(R.id.icon);
            TextView text1 = (TextView) view.findViewById(R.id.text1);
            TextView text2 = (TextView) view.findViewById(R.id.text2);
            if (icon != null) {
                icon.setImageDrawable(listElement.getIcon());
            }
            if (text1 != null) {
                text1.setText(listElement.getText1());
            }
            if (text2 != null) {
                text2.setText(listElement.getText2());
            }
        }
        return view;
    }

}   

private void startPickerActivity(Uri data, int requestCode) {
    Intent intent = new Intent();
    intent.setData(data);
    intent.setClass(getActivity(), PickerActivity.class);
    startActivityForResult(intent, requestCode);
}    

public void createButton() {

}

}

Petros Mastrantonas
  • 806
  • 1
  • 15
  • 41
  • I am confused. You do a iteration with the goal of adding buttons, right after that you call finishActivity(). – cYrixmorten Feb 25 '14 at 23:09
  • Finishactivity was already part of the example code. The activity is just to open the friendpicker after you are finished with it the activity gets closed. Is that not correct? – Petros Mastrantonas Feb 25 '14 at 23:13
  • Well, you will, extensively move away from both the friendPickerFragment and the activity holding it, hence losing the buttons. Where exactly do you hope to populate the buttons? If in the activity which holds the posted code, then you need to remove the call to finishActivity() – cYrixmorten Feb 25 '14 at 23:15
  • No I want to add them in the SelectionFragment. Is that even possible? – Petros Mastrantonas Feb 25 '14 at 23:18
  • Is it possible for you to post the code for SelectionFragment? I do not know how many lines it occupies. – cYrixmorten Feb 25 '14 at 23:23
  • Okay i just did. I am on my phone so i hope you can see the code fine and thanks for helping me :-) – Petros Mastrantonas Feb 25 '14 at 23:29
  • It was just fine :) Have tried to provide an answer – cYrixmorten Feb 26 '14 at 00:34

1 Answers1

0

Ok, this is the best I could do without fully knowing the code.

As far as I can tell, then ActionListAdapter is responsible for creating the list of friends. If I am right, then what you need to do is.

  1. Alter res/layout/listitem, adding a Button view with an id, for examples sake let it be btn_friend

       // Somewhere in res/layout/listitem
       <Button
           android:id="@+id/btn_friend"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           />
    
  2. Alter ActionListAdapter to set the text an listen for clicks

    private class ActionListAdapter extends ArrayAdapter<BaseListElement> {
        private List<BaseListElement> listElements;
    
        public ActionListAdapter(Context context, int resourceId, List<BaseListElement> listElements) {
            super(context, resourceId, listElements);
            this.listElements = listElements;
            for (int i = 0; i < listElements.size(); i++) {
                listElements.get(i).setAdapter(this);
            }
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;
            if (view == null) {
                LayoutInflater inflater =
                        (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.listitem, null);
            }
    
            BaseListElement listElement = listElements.get(position);
            if (listElement != null) {
                view.setOnClickListener(listElement.getOnClickListener());
                ImageView icon = (ImageView) view.findViewById(R.id.icon);
                TextView text1 = (TextView) view.findViewById(R.id.text1);
                TextView text2 = (TextView) view.findViewById(R.id.text2);
                Button btn = (Button) view.findViewById(R.id.btn_friend);
                if (icon != null) {
                    icon.setImageDrawable(listElement.getIcon());
                }
                if (text1 != null) {
                    text1.setText(listElement.getText1());
                }
                if (text2 != null) {
                    text2.setText(listElement.getText2());
                }
                if (btn != null) {
                    // I do not know exactly what text1 and text2 is
                    btn.setText(text1 + " waiting for game");
                    btn.setOnClickListener(new OnClickListener() {
    
                        @Override public void onClick(View v) {
                            Toast.makeText(getActivity(), text1+ " " + text2 + " clicked!", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }
            return view;
        }
    
    }   
    

Hope I have not misunderstood how the code works.

cYrixmorten
  • 7,110
  • 3
  • 25
  • 33
  • In your solution you are not adding dynamically a button, you are just altering an existing one, is that right, or am I missing something? What else I don't understand is, but maybe that is why I am not good in Java :-), why do I have to extend ActionListAdapter when all I want to do is, just add buttonn to the SelectionFragment View – Petros Mastrantonas Feb 26 '14 at 09:03
  • My thoughts are that ActionListAdapter extends ArrayAdapter, thus it is a description of how each element in a list should look like, so my hopes are that there for each friends is issued an ActionListAdapter.getView(..) which each creates it's own button by inflating the R.layout.listitem layout. – cYrixmorten Feb 26 '14 at 11:26
  • hey cYrixmorton hanks for your help. I am going into a different direction but I accepted your answer anyway to make it worthwhile for you :-) – Petros Mastrantonas Feb 28 '14 at 13:17
  • fair enough :) and no problem at all – cYrixmorten Feb 28 '14 at 16:59