2016-08-01 5 views
1

メインアクティビティファイルにグリッドビューレイアウトがあります。当初、私はすべての画像をスクロールで見ることができましたが、後で同じアクティビティでハンバーガーメニューを追加すると、gridview画像はすべての画像を表示せず、スクロールもできません。 私はactivity.xmlファイルでscrollviewを追加しましたが、残念ながらアプリケーションは停止します。ハンバーガーメニューを実装した後、グリッドビューレイアウトでスクロールできません

08-01 13:14:05.028 6153-6153/com.example.luke.goweb E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.example.luke.goweb, PID: 6153 
                     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.luke.goweb/com.example.luke.goweb.MainActivity}: android.view.InflateException: Binary XML file line #88: ScrollView can host only one direct child 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                     Caused by: android.view.InflateException: Binary XML file line #88: ScrollView can host only one direct child 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:539) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
                      at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280) 
                      at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
                      at com.example.luke.goweb.MainActivity.onCreate(MainActivity.java:38) 
                      at android.app.Activity.performCreate(Activity.java:6237) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
                      at android.os.Looper.loop(Looper.java:148)  
                      at android.app.ActivityThread.main(ActivityThread.java:5417)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
                     Caused by: java.lang.IllegalStateException: ScrollView can host only one direct child 
                      at android.widget.ScrollView.addView(ScrollView.java:269) 
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:839) 
                      at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  
                      at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280)  
                      at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)  
                      at com.example.luke.goweb.MainActivity.onCreate(MainActivity.java:38)  
                      at android.app.Activity.performCreate(Activity.java:6237)  
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)  
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)  
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
                      at android.os.Looper.loop(Looper.java:148)  
                      at android.app.ActivityThread.main(ActivityThread.java:5417)  
                      at java.lang.reflect.Method.invoke(Native Method)  

それは、scrollviewが唯一の直接の子をホストすることができます言う: これはlogcatです。それはframelayoutでうまくいきますが、私はすべての画像を見ることができず、スクロールもできません。 そして、スクロールビューでは残念ながら停止します。 しかし、グリッドビューとハンバーガーメニューは、同じアクティビティページに表示します。 ここにactivity.xmlコード:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <GridView 
     android:id="@+id/gridview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:verticalSpacing="2dp" 
     android:horizontalSpacing="2dp" 
     android:stretchMode="columnWidth" 
     android:numColumns="2"/> 
    <android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawerLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<!-- The main content view --> 
<RelativeLayout 
    android:id="@+id/mainContent" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<!-- The navigation drawer --> 
<RelativeLayout 
    android:layout_width="280dp" 
    android:layout_height="match_parent" 
    android:id="@+id/drawerPane" 
    android:layout_gravity="start"> 

    <!-- Profile Box --> 

    <RelativeLayout 
     android:id="@+id/profileBox" 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:background="@color/material_blue_grey_800" 
     android:padding="8dp" > 

     <ImageView 
      android:id="@+id/avatar" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:src="@drawable/ic_account_circle_black_24dp" 
      android:layout_marginTop="15dp" /> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="42dp" 
      android:layout_centerVertical="true" 
      android:layout_marginLeft="15dp" 
      android:layout_toRightOf="@+id/avatar" 
      android:orientation="vertical" > 

      <TextView 
       android:id="@+id/userName" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Username" 
       android:textColor="#fff" 
       android:textSize="16sp" 
       android:textStyle="bold" /> 

      <TextView 
       android:id="@+id/desc" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="bottom" 
       android:layout_marginTop="4dp" 
       android:text="View Profile" 
       android:textColor="#fff" 
       android:textSize="12sp" /> 
     </LinearLayout> 
    </RelativeLayout> 

    <!-- List of Actions (pages) --> 
    <ListView 
     android:id="@+id/navList" 
     android:layout_width="280dp" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/profileBox" 
     android:choiceMode="singleChoice" 
     android:background="#ffffffff" /> 

</RelativeLayout> 
</android.support.v4.widget.DrawerLayout> 
</FrameLayout> 

助けが必要ですか?または何か提案?前もって感謝します。

+0

エラーログでは、_ScrollView_に複数のビューを配置できないことが明らかです。 – Piyush

+0

私の提案は、GridLayoutを持つRecyclerViewです。 –

答えて

2

あなたが言ったように、すべての画像をグリッドビューで表示してスクロールすることができました。しかし、ハンバーガーメニューやナビゲーションドロワーを実装した後にスクロールが機能しませんでした。 ナビゲーション・ドロワーとグリッド・レイアウトのレイアウト・コードが混在しないと、これらの2つのファイルを分離して、必要なときにいつでも呼び出すことができます。 ナビゲーション・ドロワーを実装するための完全なコードは次のとおりです。これがあなたを助けることを願ってください。 まずXMLファイルを作成し、これらのコードを追加します。

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <!-- The main content view --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
    <!-- The navigation drawer --> 
    <ListView android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" 
     android:background="#111"/> 
</android.support.v4.widget.DrawerLayout> 

その後DrawerItemClickListenerクラスを作成し、これらのコードを追加します。

private class DrawerItemClickListener implements ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView parent, View view, int position, long id) { 
     selectItem(position); 
    } 
} 

/** Swaps fragments in the main content view */ 
private void selectItem(int position) { 
    // Create a new fragment and specify the planet to show based on position 
    Fragment fragment = new PlanetFragment(); 
    Bundle args = new Bundle(); 
    args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position); 
    fragment.setArguments(args); 

    // Insert the fragment by replacing any existing fragment 
    FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager.beginTransaction() 
        .replace(R.id.content_frame, fragment) 
        .commit(); 

    // Highlight the selected item, update the title, and close the drawer 
    mDrawerList.setItemChecked(position, true); 
    setTitle(mPlanetTitles[position]); 
    mDrawerLayout.closeDrawer(mDrawerList); 
} 

@Override 
public void setTitle(CharSequence title) { 
    mTitle = title; 
    getActionBar().setTitle(mTitle); 
} 

は今、それはあなたのMainActivityソースファイルで

public class MainActivity extends Activity { 
    private DrawerLayout mDrawerLayout; 
    private ActionBarDrawerToggle mDrawerToggle; 
    private CharSequence mDrawerTitle; 
    private CharSequence mTitle; 
    ... 

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

     mTitle = mDrawerTitle = getTitle(); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
       R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { 

      /** Called when a drawer has settled in a completely closed state. */ 
      public void onDrawerClosed(View view) { 
       super.onDrawerClosed(view); 
       getActionBar().setTitle(mTitle); 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 

      /** Called when a drawer has settled in a completely open state. */ 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       getActionBar().setTitle(mDrawerTitle); 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 
     }; 

     // Set the drawer toggle as the DrawerListener 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 
    } 

    /* Called whenever we call invalidateOptionsMenu() */ 
    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // If the nav drawer is open, hide action items related to the content view 
     boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
     menu.findItem(R.id.action_websearch).setVisible(!drawerOpen); 
     return super.onPrepareOptionsMenu(menu); 
    } 
} 
を何かを書くための時間です

これ以降、フル・グリッド・レイアウトとナビゲーション・ドロワーを表示することができます。画面を左から右にスワイプすると、ナビゲーションドロワーが表示されます。アプリケーションアイコンを使ってアクションを追加するには、@Shobhikでリンクをたどることができます。 また、@ cricket_007のように、GridLayoutを使ってRecyclerViewに行くこともできます。 これらのアドバイスに従うか、このコードはあなたの仕事を完了させるでしょう!

2

ええと、それは起こりません。 LinearLayoutでGridViewをラップし、そのLinearLayoutをScrollView内に配置してみてください。私はいつもScrollViews内のLinearLayoutsで幸運を祈っています。

EDIT:多分あなたのハンバーガーメニューは部分的にも責任があります。ナビゲーション・ドロワー(ドキュメントhere)へのGoogleのアプローチを試してください。これは、それらを別個のフラグメントに完全に配置することです。これは、そのXMLをどこにでもコピーすることなく、複数のアクティビティでそのメニューを使用できるようにするという利点があります。

EDIT 2:FrameLayout内の上のアプローチのDrawerLayoutを使用していることに気付きました。 ScrollViewの内部では、クラッシュが発生することが保証されています。 ScrollViewの外に移動すると、問題はなくなります。

1

FrameLayout多くの子を含むことができますが、ScrollViewできません。 ScrollViewをそのまま使用する場合は、LinearLayoutなどを他の子の親として追加してください。

関連する問題