在嵌套片段中以编程方式生成可变数量的布局?

时间:2017-02-20 13:25:00

标签: android android-layout android-fragments

因此,正如标题所述,我希望在片段中产生一定数量的布局,而这片段又在片段内。布局数取决于从数据库返回的列数,返回的列数取决于用户当前使用的片段数。

第一个片段是BottomNavigation View,然后第二组片段是BottomNavigation的每个部分内的一系列滑动面板。我希望在这些片段中生成可变数量的布局。

Here is a screenshot of what I'm looking to achieve

我试图在内部Fragment的OnCreateView()方法中创建Layouts但是这会导致错误。我知道OnCreateView()返回一个视图,所以在这里尝试创建这些布局肯定是错误的。

我基本上有我的主类,它被分成4个bottomNav片段,每个片段被分成2-6片段本身。

我应该在哪里创建这些布局?有没有其他方法来实现目标?为什么无法在OnCreateView()中创建布局?我对整个过程非常困惑,尽管问题可能是一个简单的修复。任何帮助将不胜感激。

如果有必要,我可以提供代码,但希望这是一个简单的问题,不需要它。

编辑:下面我添加了我到目前为止的代码:

MainActivity(产生BottomNavigation):

public class MainActivity extends AppCompatActivity {
private static final String SELECTED_ITEM = "arg_selected_item";

private BottomNavigationView mBottomNav;
private int mSelectedItem;
public static int numTabs;
public static String fragType;
public static String[] headings;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mBottomNav = (BottomNavigationView) findViewById(R.id.navigation);
    mBottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            selectFragment(item);
            return true;
        }
    });

    MenuItem selectedItem;
    if (savedInstanceState != null) {
        mSelectedItem = savedInstanceState.getInt(SELECTED_ITEM, 0);
        selectedItem = mBottomNav.getMenu().findItem(mSelectedItem);
    } else {
        selectedItem = mBottomNav.getMenu().getItem(0);
    }
    selectFragment(selectedItem);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(SELECTED_ITEM, mSelectedItem);
    super.onSaveInstanceState(outState);
}

@Override
public void onBackPressed() {
    MenuItem homeItem = mBottomNav.getMenu().getItem(0);
    if (mSelectedItem != homeItem.getItemId()) {
        // select home item
        selectFragment(homeItem);
    } else {
        super.onBackPressed();
    }
}

private void selectFragment(MenuItem item) {
    Fragment frag = null;
    // init corresponding fragment
    switch (item.getItemId()) {
        //USER PROFILE
        case R.id.menu_home:
            numTabs = 3;
            fragType = getString(R.string.text_home);
            headings = new String[numTabs];
            headings[0] = "PROFILE HEADING 1";
            headings[1] = "PROFILE HEADING 2";
            headings[2] = "PROFILE HEADING 3";
            frag = MenuFragment.newInstance(fragType);
            break;
        //DISCOVER
        case R.id.menu_search:
            fragType = getString(R.string.text_search);
            numTabs = 6;
            headings = new String[numTabs];
            headings[0] = "DISCOVER HEADING 1";
            headings[1] = "DISCOVER HEADING 2";
            headings[2] = "DISCOVER HEADING 3";
            headings[3] = "DISCOVER HEADING 4";
            headings[4] = "DISCOVER HEADING 5";
            headings[5] = "DISCOVER HEADING 6";
            frag = MenuFragment.newInstance(fragType);
            break;
        //SCHEDULE
        case R.id.menu_notifications:
            fragType = getString(R.string.text_notifications);
            numTabs = 2;
            headings = new String[numTabs];
            headings[0] = "SCHEDULE HEADING 1";
            headings[1] = "SCHEDULE HEADING 2";
            frag = MenuFragment.newInstance(fragType);
            break;
        //FOLLOWED
        case R.id.menu_followed:
            fragType = getString(R.string.text_follow);
            numTabs = 3;
            headings = new String[numTabs];
            headings[0] = "FOLLOWED HEADING 1";
            headings[1] = "FOLLOWED HEADING 2";
            headings[2] = "FOLLOWED HEADING 3";
            frag = MenuFragment.newInstance(fragType);
    }

    // update selected item
    mSelectedItem = item.getItemId();

    // uncheck the other items.
    for (int i = 0; i< mBottomNav.getMenu().size(); i++) {
        MenuItem menuItem = mBottomNav.getMenu().getItem(i);
        menuItem.setChecked(menuItem.getItemId() == item.getItemId());
    }

    if (frag != null) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.container, frag, frag.getTag());
        ft.commit();
    }
}
}

这是MenuFragment类:

public class MenuFragment extends Fragment {
private static final String ARG_TEXT = "arg_text";

private String mText;

private TextView mTextView;
private Button contactButton;
private Button logoutButton;

public static Fragment newInstance(String text) {
    Fragment frag = new MenuFragment();
    Bundle args = new Bundle();
    args.putString(ARG_TEXT, text);
    frag.setArguments(args);
    return frag;
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View result = inflater.inflate(R.layout.fragment_menu, container, false);
    ViewPager view = (ViewPager)result.findViewById(R.id.pager);
    view.setAdapter(buildAdapter());
    return(result);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (savedInstanceState == null) {
        Bundle args = getArguments();
        mText = args.getString(ARG_TEXT);
    } else {
        mText = savedInstanceState.getString(ARG_TEXT);
    }

    // initialize views
    mTextView = (TextView) view.findViewById(R.id.text);
    contactButton = (Button) view.findViewById(R.id.contactButton);
    logoutButton = (Button) view.findViewById(R.id.logoutbutton);

    // set text
    mTextView.setText(mText);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putString(ARG_TEXT, mText);
    super.onSaveInstanceState(outState);
}

private PagerAdapter buildAdapter() {
    return(new MidSectionAdapter(getActivity(), getChildFragmentManager()));
}
}

这是MidSectionAdapter:

public class MidSectionAdapter extends FragmentPagerAdapter {
Context ctxt=null;
String title;

public MidSectionAdapter(Context ctxt, FragmentManager mgr) {
    super(mgr);
    this.ctxt=ctxt;
}

@Override
public int getCount() {
    return(MainActivity.numTabs);
}

@Override
public Fragment getItem(int position) {
    if(MainActivity.fragType.equals("MY PROFILE")) {
        return(ProfileFragment.newInstance(position));
    } else if(MainActivity.fragType.equals("DISCOVER")) {
        return(DiscoverFragment.newInstance(position));
    } else if(MainActivity.fragType.equals("SCHEDULE")) {
        return(ScheduleFragment.newInstance(position));
    } else {
        return(UpComingFragment.newInstance(position));
    }
}

@Override
public String getPageTitle(int position) {

    if(MainActivity.fragType.equals("MY PROFILE")) {
        title = ProfileFragment.getTitle(ctxt, position);
    } else if(MainActivity.fragType.equals("DISCOVER")) {
        title = DiscoverFragment.getTitle(ctxt, position);
    } else if(MainActivity.fragType.equals("SCHEDULE")) {
        title = ScheduleFragment.getTitle(ctxt, position);
    } else {
        title = UpComingFragment.getTitle(ctxt, position);
    }
    return(title);
}
}

这里有一个内部片段的例子(我已经将它恢复为我遇到问题之前的代码,所以它除了显示“在面板x中”之外没什么作用):

public class ScheduleFragment extends Fragment {
private static final String KEY_POSITION="position";
private TextView panelView;
private static String head;
private static int panelPosition;
String panelCheck;

static ScheduleFragment newInstance(int position) {
    ScheduleFragment frag=new ScheduleFragment();
    Bundle args=new Bundle();

    args.putInt(KEY_POSITION, position);
    frag.setArguments(args);

    return(frag);
}

static String getTitle(Context ctxt, int position) {
    head = MainActivity.headings[position];
    panelPosition = position;
    return(head);
}

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState) {
    View result=inflater.inflate(R.layout.schedule_content, container, false);
    panelView = (TextView) result.findViewById(R.id.testFrag);
    int position=getArguments().getInt(KEY_POSITION, -1);
    if(getTitle(getActivity(), position).equals(MainActivity.headings[0])) {
        //MAY NOT NEED THIS NITIAL IF STATEMENT
        panelCheck = "in first panel";
    } else {
        //tableType = "Venue";
        panelCheck = "in second panel";
    }
    panelView.setText(panelCheck);

    return(result);
}
}

1 个答案:

答案 0 :(得分:0)

顺便说一句,您可以在Android Activity中创建/添加/替换n个片段。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_activity)
        //or
        LinearLayout layout = getLayoutInflator.inflate(R.layout.your_activity);
        setContentView(layout)
}

同样,您可以在Activity和Fragment中创建n个视图。

    private LayoutInflater fragmentInflater,
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        this.fragmentInflater = inflater;
        View view = inflater.inflate(R.layout.alto_dialog, container, false);
        return view;
    }

基本上,您可以随时创建Views / ViewGroups添加/删除视图。你想要的是 fragmentInflater 对象。

根据您的屏幕截图要求,您可能需要具有不同视图类型的 ListView RecyclerView 。如果您的列表很小,您可以直接使用 ScrollView + LinearLayout

希望这有帮助。