2017-02-20 4 views
1

タイトルが述べるように、フラグメント内にある量のレイアウトを生成したいと思います。レイアウトの数は、データベースから返される列の数に依存し、返される列の数は、ユーザーが現在どのフラグメントに依存しているかによって異なります。ネストされたフラグメント内でプログラムでレイアウトの量を変えることはできますか?

最初のフラグメントはBottomNavigation Viewで、2番目のFragmentセットはBottomNavigationの各パーツ内の一連のスワイプパネルです。これらの断片の中で、私は可変数のレイアウトを作りたいと思っています。

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

私は内側のフラグメントのためのOnCreateView()メソッド内のレイアウトを作成しようとしていたが、それは、エラーの原因となっています。 OnCreateView()がビューを返すので、ここでこれらのレイアウトを作成しようとすると間違っているはずです。

私は基本的に4つのbottomNavフラグメントに分割されたそれぞれのメインクラスを持っています。それぞれのフラグメントは2〜6個のフラグメントに分割されています。

どこでこれらのレイアウトを作成する必要がありますか?目的を達成するための他の方法がありますか? OnCreateView()内でレイアウトを作成できないのはなぜですか?私はこのプロセス全体で非常に混乱していますが、問題はおそらく簡単な解決策に過ぎません。どんな助けでも大歓迎です。

必要に応じてコードを提供することはできますが、これは必要ではないほど簡単な問題です。


EDIT:(BottomNavigationを生成)

MainActivity:私は、私がこれまで持っているコードを追加した下

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

スワイプパネルのレイアウトがそれぞれ異なりますか?そうでなければ、ただ1つのレイアウトxmlファイルを作成し、その1つのレイアウトを使用して多数のフラグメントを作成します。 –

+0

@theblitzどのようにRecyclerViewを実装しますか、それはFragmentsとはまったく異なりますか?おそらく私はあなたに私のコードを示すことができ、私を助けることができたでしょうか? innerViewsにはBottomNav Fragmentに応じて異なるコンテンツが含まれます。いくつかは画像、その他の拡張可能なテキストなどです。これはRecyclerViewを使用する能力に影響しますか?私はAndroidの開発に新しいです、私の不適格のために謝罪します! – aodhaganor

答えて

0

ところで、Androidアクティビティで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) 
} 

同様に、アクティビティ内にビューとフラグメントを作成することができます。

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

ビュー/ビューグループの追加/削除は、いつでも必要なときにいつでも行うことができます。あなたが欲しいのは、fragmentInflaterオブジェクトです。

スクリーンショットREQによると、あなたは別のビュータイプでリストビューまたはRecyclerViewが必要な場合があります。あなたのリストが小さい場合は、単にで頭を下げることができます。ScrollView + LinearLayout

希望します。

+0

プロジェクトのコードをオリジナルの投稿に追加しました。あなたは一見を取って、私がどれほど間違っていたかを見てみることができますか?私はプロジェクトの大きな部分を変更する必要があるかもしれないと思っています。私は、Bottom Navigation View内にネストされているフラグメントの性質のために、あなたが話していることをどこで実装するのか分かりません。私はAndroidプログラミングと完全に初心者ですが、Javaについて言えば最高です。どんな助けでも大歓迎です! :) – aodhaganor

+0

私の元の投稿の下のコメントにそれが見えなかった場合: BottomNavフラグメント内の各スワイプビュー(たとえば、「プロファイル」セクションに対応する3つのパネル)は同じレイアウトですが、 BottomNavフラグメントは内側のフラグメントレイアウトを変更します(例えば、 "Discover"に変更すると、スワイプフラグメントには同じレイアウトが含まれますが、 "Profile"のものとは異なることを意味します)。 – aodhaganor

+0

あなたのコードを見ました。基本的には、schedule_content.xmlにListViewを含める必要があります。その後、onCreateViewで初期化します。それに続いて、カーソルを作成してそれぞれのDB結果セットを取得し、新しく作成したArrayAdapterに渡します。それはあなたが上記のリストのために設定しようとしているものです。カスタムのArray Adapter getViewメソッドでビューの作成が行われるようになりました。また、必要に応じてgetViewで異なるレイアウトを作成することもできます。複数のカスタム行/ビューでリストビューを作成する方法。もう一つ。あなたはあなたの顧客に活動や文脈、インフレータを渡すべきです – albeee

関連する問題