2017-02-20 3 views
1

Итак, как указано в заголовке, я хочу создать некоторое количество макетов внутри фрагмента, который в свою очередь находится внутри фрагмента. Количество макетов зависит от количества столбцов, возвращаемых из базы данных, а число возвращаемых столбцов зависит от того, какой фрагмент пользователь в данный момент включен.Производить переменное количество макетов программно внутри вложенного фрагмента?

Первые фрагменты представляют собой представление BottomNavigation, тогда второй набор фрагментов представляет собой ряд салфеток в каждой части BottomNavigation. Именно в этих фрагментах я хочу создать переменное количество макетов.

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

Я пытался создать макеты в рамках методы OnCreateView() для внутреннего фрагмента, но это вызывает ошибку. Я знаю, что OnCreateView() возвращает представление, поэтому должно быть неправильно, чтобы попытаться создать эти макеты здесь.

У меня есть основной класс, который разделен на 4 нижних фрагмента Nav, каждый из которых разделен на 2-6 фрагментов.

Где я должен создавать эти макеты? Есть ли другой способ достичь цели? Почему в OnCreateView() невозможно создать макет? Я очень смущен всем процессом, хотя проблема, вероятно, достаточно проста. Любая помощь приветствуется.

При необходимости я могу предоставить код, хотя, надеюсь, это достаточно простая проблема, которая не нужна.


EDIT: Ниже я добавил код, который я до сих пор:

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

Не знаете, почему вы не используете RecyclerView для внутренних просмотров. Я что-то упускаю? – theblitz

+0

У ваших панелей салфетки разная компоновка? Если нет, тогда создайте только один макет xml-файла и создайте столько фрагментов, используя этот единственный макет. –

+0

@theblitz Как вы реализуете RecyclerView, это сильно отличается от фрагментов? Возможно, я смогу показать вам свой код, и вы могли бы помочь мне? Внутренние элементы будут содержать различный контент в зависимости от фрагмента BottomNav. Некоторые из них будут изображениями, другими расширяемыми текстами и т. Д. Это влияет на способность использовать RecyclerView? Я новичок в разработке Android, извиняюсь за свою неумелость! – aodhaganor

ответ

0

Кстати, вы можете создавать/добавлять/заменять n фрагментов в Android Activity.

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

Аналогичным образом вы можете создать 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.

По вашему скриншоту REQ, вам может понадобиться ListView или RecyclerView с различными типами зрения.Если ваш список невелик, вы можете просто пойти головой с ScrollView + LinearLayout

Надеюсь, это поможет.

+0

Я добавил свой код для проекта в свой оригинальный пост. Не могли бы вы взглянуть и посмотреть, как далеко я ушел? Я начинаю думать, что мне может потребоваться изменить большой кусок проекта. Я не знаю, где реализовать то, о чем вы говорите, из-за того, что фрагменты, вложенные в мой снимок BottomNavigation View. Я полный новичок в программировании на Android и в лучшем случае, когда дело доходит до Java. Любая помощь будет принята с благодарностью! :) – aodhaganor

+0

Если вы не видели этого в комментариях к моему первоначальному сообщению: Каждый вид прокрутки в фрагменте BottomNav (например, 3 панели, соответствующие разделу «Профиль») - это один и тот же макет, но затем изменение фрагмент BottomNav изменит внутренний макет фрагмента (например, изменение на «Discover» будет означать, что фрагменты сапфира содержат один и тот же макет друг друга, но отличаются от таковых в «профиле») – aodhaganor

+0

Я видел ваш код. В основном вы должны включить ListView в schedule_content.xml. Затем инициализируйте его в onCreateView. Вслед за этим создайте курсор, чтобы получить соответствующий набор результатов DB и передать его снова новому ArrayAdapter. Это тот, который вы собираетесь установить для вышеуказанного списка. Теперь создание представления должно произойти в вашем настраиваемом методе getView Array Adapter. Вы также можете создавать разные макеты в getView, зависит от ваших потребностей. Google, как создать список с несколькими пользовательскими строками/представлениями. Еще кое-что. Вы должны передать активность, или контекст, или инфлятор, на ваш cust – albeee

Смежные вопросы