簡體   English   中英

以編程方式添加的元素未出現在片段中

[英]programmatically added elements not appearing in fragment

創建片段后,它將調用

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;
    }

並在其中調用populatepage()方法。 在該方法中,將調用Web服務。 我已經驗證了數據已經退出,並且所有內容運行都沒有錯誤。

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();
                                  }
                              }

                        ));
    }
}

由於某種原因,當應用程序啟動時,該片段為空白,好像什么也沒添加,我不知道為什么。 我試過將linearlayout添加到片段xml中,並通過其ID進行抓取,但是即使在程序中的其他片段中僅執行此操作,它也會得到null引用錯誤。

看來您已正確地將視圖添加到已創建的線性布局中,但是我看不到將新創建的布局添加到片段視圖中的位置。

這是文檔示例

從示例中獲取:

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));

修改為您的具體情況:

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));
}

您是對的,關於您最近的編輯,我犯了一個錯誤。 獲取對XML文件中的基本布局對象的引用(相對/線性/框架布局等),然后在其上調用addView方法。

在示例中,您給ll對象創建了一個對象,但從未將其添加到片段中。 您可以從populatePage()函數返回LinearLayout對象,並將其添加到onCreateView片段視圖中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM