我DynamicFragment.java的如下
public class DynamicFragment extends Fragment {
public static DynamicFragment newInstance() {
return new DynamicFragment();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// adding the layout with inflater
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_dynamic, container, false);
initViews(view);
return view;
}
// initialise the categories
private void initViews(View view) {
TextView textView = view.findViewById(R.id.commonTextView);
textView.setText(String.valueOf("Category : " getArguments().getInt("position")));
TextView userName = view.findViewById(R.id.userName);
userName.setText("Name :" getArguments().getString("name"));
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
// pause function call
@Override
public void onPause() {
super.onPause();
}
// resume function call
@Override
public void onResume() {
super.onResume();
}
// stop when we close
@Override
public void onStop() {
super.onStop();
}
// destroy the view
@Override
public void onDestroyView() {
super.onDestroyView();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
DynamicFragmentAdapter.java在下面:
public class DynamicFragmentAdapter extends FragmentStatePagerAdapter {
private int mNumOfTabs;
DynamicFragmentAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
// get the current item with position number
@Override
public Fragment getItem(int position) {
Bundle b = new Bundle();
b.putInt("position", position);
Fragment frag = DynamicFragment.newInstance();
frag.setArguments(b);
return frag;
}
// get total number of tabs
@Override
public int getCount() {
return mNumOfTabs;
}
}
DynamicActivity.java如下:
public class DynamicActivity extends AppCompatActivity {
private ViewPager viewPager;
private TabLayout mTabLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dynamic);
initViews();
}
private void initViews() {
// initialise the layout
viewPager = findViewById(R.id.viewpager);
mTabLayout = findViewById(R.id.tabs);
// setOffscreenPageLimit means number
// of tabs to be shown in one page
viewPager.setOffscreenPageLimit(5);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
// setCurrentItem as the tab position
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
setDynamicFragmentToTabLayout();
}
// show all the tab using DynamicFragmnetAdapter
private void setDynamicFragmentToTabLayout() {
try {
// get JSONObject from JSON file
JSONObject obj = new JSONObject(loadJSONFromAsset());
// fetch JSONArray named contacts
JSONArray userArray = obj.getJSONArray("contacts");
int arrayLength = userArray.length();
// implement for loop for getting users list data
for (int i = 0; i < arrayLength; i ) {
// create a JSONObject for fetching single user data
JSONObject userDetail = userArray.getJSONObject(i);
// fetch name and store it in arraylist
MainActivity.personNames.add(userDetail.getString("name"));
// set the tab name as "Page: " i
mTabLayout.addTab(mTabLayout.newTab().setText("Page:" i));
}
} catch (JSONException e) {
e.printStackTrace();
}
DynamicFragmentAdapter mDynamicFragmentAdapter = new DynamicFragmentAdapter(getSupportFragmentManager(), mTabLayout.getTabCount());
// set the adapter
viewPager.setAdapter(mDynamicFragmentAdapter);
// set the current item as 0 (when app opens for first time)
viewPager.setCurrentItem(0);
}
public String loadJSONFromAsset() {
String json = null;
try {
InputStream is = getAssets().open("contact_data.json");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
json = new String(buffer, "UTF-8");
} catch (IOException ex) {
ex.printStackTrace();
return null;
}
return json;
}
}
name盡管我在下面定義了TextView 用戶名fragment_dynamic.xml,但它不會從 JSON 加載并在片段中顯示為“null”
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<TextView
android:id="@ id/commonTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="zxjhcvzxvchjzxbhj"
android:textColor="@color/purple_500"
android:textStyle="bold" />
<TextView
android:id="@ id/userName"
android:layout_below="@id/commonTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="zxjhcvzxvchjzxbhj"
android:textColor="@color/purple_500"
android:textStyle="bold" />
</RelativeLayout>
我截斷的contacts.json如下:
{
"contacts": [
{
"id": "1",
"name": "Amitabh"
"age": "25"
},
{
"id": "2",
"name": "Amit"
"age": "30"
}
]
}
當我從 FOR 回圈中掃過片段時,選項卡的位置編號會正確更新,但名稱在所有片段中都顯示為“null”。我對這些JSON概念及其在Fragmentsand中的使用不熟悉Tablayouts。在這方面的任何幫助都會有很大幫助。
我認為我的 JSON 資料中的變數名沒有與 java 類中的變數鏈接,也不知道該怎么做。
提前致謝!
uj5u.com熱心網友回復:
嘗試將其存盤personNames 在區域變數中并將其傳遞給配接器:
ArrayList<String> personNames = new ArrayList<String>()
try {
// get JSONObject from JSON file
JSONObject obj = new JSONObject(loadJSONFromAsset());
// fetch JSONArray named contacts
JSONArray userArray = obj.getJSONArray("contacts");
int arrayLength = userArray.length();
// implement for loop for getting users list data
for (int i = 0; i < arrayLength; i ) {
// create a JSONObject for fetching single user data
JSONObject userDetail = userArray.getJSONObject(i);
// fetch name and store it in arraylist
personNames.add(userDetail.getString("name"));
// set the tab name as "Page: " i
mTabLayout.addTab(mTabLayout.newTab().setText("Page:" i));
}
} catch (JSONException e) {
e.printStackTrace();
}
DynamicFragmentAdapter mDynamicFragmentAdapter = new DynamicFragmentAdapter(getSupportFragmentManager(), mTabLayout.getTabCount(), personNames);
// set the adapter
viewPager.setAdapter(mDynamicFragmentAdapter);
然后,從配接器,將name 引數傳遞給DynamicFragment:
public class DynamicFragmentAdapter extends FragmentStatePagerAdapter {
private int mNumOfTabs;
private ArrayList<String> personNames;
DynamicFragmentAdapter(FragmentManager fm, int NumOfTabs, ArrayList<String> personNames) {
super(fm);
this.mNumOfTabs = NumOfTabs;
this.personNames = personNames;
}
// get the current item with position number
@Override
public Fragment getItem(int position) {
Bundle b = new Bundle();
b.putInt("position", position);
b.putString("name", personNames[position])
Fragment frag = DynamicFragment.newInstance();
frag.setArguments(b);
return frag;
}
最后,您應該能夠在Fragment using 中訪問名稱(就像您在做的那樣):
getArguments().getString("name")
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/428161.html
