1

When my fragment is created it calls

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View layout=inflater.inflate(R.layout.fragment_item_fragment1, container, false);
        populatePage();
        return layout;
    }

and within that calls the populatepage() method. Within that method a call to a webservice is made. I have verified that the data exits and everything runs without error.

public void populatePage(){
        String globalKey = "key";
        String url = "";
        //shared preferences
        SharedPreferences settings = getActivity().getSharedPreferences(sharedPreferences, 0);
        final String SESSION_KEY = settings.getString("SESSION_KEY", "nothing is here");
        String FILE_KEY = settings.getString("FILE_KEY", "");
        String page = settings.getString("PAGE", "Part");
        final String group = settings.getString("FRAG_1", "");
        String record = settings.getString("RECORD", "");

        //BUILD THE URL WE NEED
        url = "https://url.com/"

        //loading page

        //Declare the headers and add the pairs
        Headers header =  new Headers();
        header.add("X-SESSION-KEY", SESSION_KEY);
        header.add("X-GLOBAL-KEY", globalKey);

        //Layout for building upon
        final LinearLayout ll = new LinearLayout(getActivity());
        ll.setOrientation(LinearLayout.VERTICAL);

        $.ajax(new AjaxOptions().url(url)
                .type("GET")
                .dataType("json")
                .headers(header)
                .contentType("application/json")
                .context(getActivity()).success(new Function() {
                                           @Override
                                           public void invoke($ droidQuery, Object... params) {
                                               JSONObject json = (JSONObject) params[0];
                                               try {
                                                   Boolean session = json.getBoolean("valid");
                                                   if (session) {
                                                       JSONArray recordsArray = json.getJSONArray("field");
                                                       String groupName = ""; //we compare group to this before adding it as a preference since we dont want dupes
                                                       for (int i = 0; i < recordsArray.length(); i++) {
                                                           JSONObject record = recordsArray.getJSONObject(i);
                                                           //BIG MESSY IF STATEMENT TO PARSE DATA! HOORAY!
                                                           if (record.getString("group").equals(group)) {
                                                               if (record.getString("valueType").equals("Text")) {

                                                                   TextView label = new TextView(getActivity());
                                                                   label.setText(record.getString("label"));
                                                                   label.setPadding(20, 20, 20, 0);
                                                                   label.setTextSize(20);
                                                                   label.setTypeface(null, Typeface.BOLD);
                                                                   label.setTextColor(Color.BLACK);
                                                                   ll.addView(label);

                                                                   TextView value = new TextView(getActivity());
                                                                   value.setPadding(20, 0, 20, 20);
                                                                   value.setTextSize(17);
                                                                   value.setTextColor(Color.BLACK);
                                                                   value.setText(record.getString("value"));
                                                                   ll.addView(value);

                                                               } else if (record.getString("valueType").equals("Image")) {

                                                                   TextView label = new TextView(getActivity());
                                                                   label.setText(record.getString("label"));
                                                                   label.setPadding(20, 20, 20, 20);
                                                                   label.setTextSize(20);
                                                                   label.setTypeface(null, Typeface.BOLD);
                                                                   label.setTextColor(Color.BLACK);
                                                                   ll.addView(label);

                                                                   byte[] decodedString = Base64.decode(record.getString("value"), Base64.DEFAULT);
                                                                   Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
                                                                   ImageView image = new ImageView(getActivity());
                                                                   image.setImageBitmap(decodedByte);
                                                                   image.setScaleType(ImageView.ScaleType.FIT_START);
                                                               }
                                                           }
                                                       }
                                                       progressDialog.dismiss();
                                                       progressDialog.cancel();
                                                   } else {
                                                       droidQuery.toast("Session Expired", Toast.LENGTH_LONG);
                                                       Intent intent = new Intent(getActivity(), LoginActivity.class);
                                                       startActivity(intent);
                                                   }
                                               } catch (JSONException e) {
                                                   droidQuery.toast(e.toString(), Toast.LENGTH_SHORT);
                                               }
                                           }
                                       }

                ).

                        error(new Function() {
                                  @Override
                                  public void invoke($ droidQuery, Object... params) {
                                      Log.e("$", "broke good");
                                      //DELETE THIS
                                      Context context = getActivity();
                                      CharSequence text = "Could not connect to Server";
                                      int duration = Toast.LENGTH_LONG;

                                      Toast toast = Toast.makeText(context, text, duration);
                                      toast.show();
                                  }
                              }

                        ));
    }
}

For some reason when the app launches the fragment is blank as if nothing is added and I can't figure out why. I've tried added the linearlayout to the fragments xml and grabbing it by it's ID but I get a null reference error even though I do just that in another fragment elsewhere in the program and it works.

AlexF11
  • 231
  • 1
  • 5
  • 20

2 Answers2

2

It looks like you're correctly adding the view to the Linear Layout you've created, but I don't see a spot where you're adding that newly created Layout to the Fragment's View.

Here is the documentation and an example

Taken from the example:

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.your_layout, null);

// fill in any details dynamically here
TextView textView = (TextView) v.findViewById(R.id.a_text_view);
textView.setText("your text");

// insert into main view
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

Modified to your specific situation:

populatePage(layout);

public void populatePage(View v){

    ...other code here...
    RelativeLayout relativeLayout = (RelativeLayout)v. findViewById(R.id.id_that_exists_in_your_xml);
    relativeLayout.addView(ll, 0, new ViewGroup.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT));
}

You're right, regarding your most recent edit, I made a mistake. Get reference to the base layout object in your XML file (Relative/Linear/Frame layout etc), and then call the addView method on that.

Community
  • 1
  • 1
joebro
  • 581
  • 3
  • 11
  • How would I do that? normally you'd use setcontentview wouldnt you? – AlexF11 Jun 28 '16 at 16:09
  • Nope! You can call view.addView(). Here is the [documentation](https://developer.android.com/reference/android/view/View.html) and an [example](http://stackoverflow.com/questions/6216547/android-dynamically-add-views-into-view) – joebro Jun 28 '16 at 16:12
  • but what would I call .addview on? – AlexF11 Jun 28 '16 at 16:13
  • You would call addView on the view defined here: `View layout=inflater.inflate(R.layout.fragment_item_fragment1, container, false); ` – joebro Jun 28 '16 at 16:13
  • Finally got it, thanks for your persistence I was about to scrap the entire thing @joebro – AlexF11 Jun 28 '16 at 16:48
  • No problem! Happy to help. – joebro Jun 28 '16 at 17:00
0

From the example you gave the ll object just created but never added to fragment. You can return LinearLayout object from populatePage() function and add it to fragment view in onCreateView.

madatx
  • 81
  • 5