2016-10-09 6 views
0

私はthisチュートリアルを使用してアプリケーションを作成しています。私は自分のコードでいくつかの変更を加えました。つまり、サーバーからメインアクティビティにデータを取得し、それをフラグメントに渡したかったのです。その前に、私が完全に働いていたアプリを開くと、今すぐクラッシュします。 私は質問をする前に、stackoverflowの12345 ...)から回答の束を試してみましたが、それらのどれもが私の質問に答えていません。フラグメントを直接レストランから取得していたとき、それは完全に機能しましたが、アクティビティからデータを渡すとこのエラーが発生します。アクティビティのデータをフラグメントに渡すと、 "ScrollViewは1つの直接の子のみをホストできます"エラー

主な活動(私は、サーバーからデータを取得し、フラグメントに渡し渡し):

TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs); 
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_map))); 
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_list))); 
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_my_list))); 
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
tabLayout.setTabMode(TabLayout.MODE_FIXED); 

final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
final PagerAdapter adapter = new PagerAdapter 
    (getSupportFragmentManager(), tabLayout.getTabCount()); 
viewPager.setAdapter(adapter); 
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 

RestaurantsFragment restaurantsFragment = new RestaurantsFragment(); 
Bundle args = new Bundle(); 
args.putParcelableArrayList("restaurantList", (ArrayList<? extends Parcelable>) restaurantList); 
restaurantsFragment.setArguments(args); 

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
fragmentTransaction.replace(R.id.sliding_tabs, restaurantsFragment); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commit(); 

レストラン断片(私は私の主な活動からデータを得るか、私はデバッグサーバからレストランを取得します) :

public class RestaurantsFragment extends Fragment { 

private static final String TAG = RestaurantsFragment.class.getSimpleName(); 

// Restaurants json url 
private ProgressDialog pDialog; 
private ArrayList restaurantList = new ArrayList<>(); 
private ListView listView; 
private CustomListAdapter adapter; 

@Override 
public View onCreateView(LayoutInflater inflater, 
         ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_restaurants, container, false); 

    Bundle bundle = this.getArguments(); 
    if (bundle != null) { 
     restaurantList = bundle.getParcelableArrayList ("restaurantList"); 
    } 

    listView = (ListView) view.findViewById(R.id.restaurants_list); 
    adapter = new CustomListAdapter(getActivity(), restaurantList); 
    listView.setAdapter(adapter); 

    pDialog = new ProgressDialog(getActivity()); 

    pDialog.setMessage("Loading..."); 
    pDialog.show(); 


    return view; 
} 

fragment_restaurants

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".sliderfragments.RestaurantsFragment"> 

<ListView 
    android:id="@+id/restaurants_list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:divider="@color/list_divider" 
    android:dividerHeight="1dp" 
    android:listSelector="@drawable/list_row_selector" /> 

</RelativeLayout> 

list_row

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:background="@drawable/list_row_selector" 
android:padding="8dp"> 

<!-- Thumbnail Image --> 
<com.android.volley.toolbox.NetworkImageView 
    android:id="@+id/thumbnail" 
    android:background="@drawable/default_profile" 
    android:layout_width="80dp" 
    android:layout_height="80dp" 
    android:layout_alignParentLeft="true" 
    android:layout_marginRight="8dp" /> 

<!-- User Name --> 
<TextView 
    android:id="@+id/userName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@+id/thumbnail" 
    android:layout_toRightOf="@+id/thumbnail" 
    android:textSize="@dimen/userName" 
    android:textStyle="bold" /> 

<!-- Date --> 
<TextView 
    android:id="@+id/date" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/userName" 
    android:layout_marginTop="1dip" 
    android:layout_toRightOf="@+id/thumbnail" 
    android:textSize="@dimen/date" /> 

<!-- Time --> 
<TextView 
    android:id="@+id/time" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/date" 
    android:layout_marginTop="5dp" 
    android:layout_toRightOf="@+id/thumbnail" 
    android:textColor="@color/time" 
    android:textSize="@dimen/time" /> 

</RelativeLayout> 

content_main

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
app:layout_behavior="@string/appbar_scrolling_view_behavior" 
tools:context=".MainActivity" 
tools:showIn="@layout/app_bar_main"> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/sliding_tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:tabMode="scrollable" /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="0px" 
     android:layout_weight="1" 
     android:background="@android:color/white" /> 
</android.support.design.widget.AppBarLayout> 

ページャアダプタ:

public class PagerAdapter extends FragmentStatePagerAdapter { 
int mNumOfTabs; 

public PagerAdapter(FragmentManager fm, int NumOfTabs) { 
    super(fm); 
    this.mNumOfTabs = NumOfTabs; 
} 

@Override 
public Fragment getItem(int position) { 

    switch (position) { 
     case 0: 
      MapsFragment tab1 = new MapsFragment(); 
      return tab1; 
     case 1: 
      RestaurantsFragment tab2 = new RestaurantsFragment(); 
      return tab2; 
     case 2: 
      MyRestaurantsFragment tab3 = new MyRestaurantsFragment(); 
      return tab3; 
     default: 
      return null; 
    } 
} 

@Override 
public int getCount() { 
    return mNumOfTabs; 
} 
} 

スタックトレース:

10-09 12:30:12.755 32374-32374/? E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.test.kemo.restaurant, PID: 32374 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.kemo.restaurant/com.test.kemo.restaurant.MainActivity}: java.lang.IllegalStateException: HorizontalScrollView can host only one direct child 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
    at android.app.ActivityThread.access$800(ActivityThread.java:135) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5021) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.IllegalStateException: HorizontalScrollView can host only one direct child 
    at android.widget.HorizontalScrollView.addView(HorizontalScrollView.java:216) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
    at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330) 
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547) 
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1174) 
    at android.app.Activity.performStart(Activity.java:5347) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
    at android.app.ActivityThread.access$800(ActivityThread.java:135) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5021) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

あなたのMainActivityの右にscrollViewがありますか? 1つのscrollViewに2人の子供を追加することはできません!問題はあなたがスクロールビューについて考えるものではなく、その中の子供たちは1つ以上ではありません! –

+0

@Amir Ziaratiこれは私の断片の中のサーバからリストを取得しても問題なく動作しました。しかし、私はそれを変更し、私の主な活動でサーバーコールを呼び出し、それを私の断片に渡したが、これが起こった。 – Kemo

+0

あなたのmainActivityのXMLコードを質問に入れてください –

答えて

1

スライディングタブビューにフラグメントを追加しています。あなたが書いた:https://developer.android.com/reference/android/support/design/widget/TabLayout.html

私はどのようにあなたのアプリケーションの動作を知らないが、それはそのことのために複数の子を作る原因あなたがここにTabLayoutにあなたのフラグメントを追加カント:

fragmentTransaction.replace(R.id.sliding_tabs, restaurantsFragment); 

タブレイアウトは、マニュアルを参照して、水平scrollviewの子であります(TabLaoutは実際には内部の水平スクロールビューです)

fragmentTransaction.replace()ここでは、フラグメントを追加するコンテナを指定する必要があります。あなたのコードがあなたのビューペイジャーのタイトルにtabLayputを使用していて、その中のあなたのフラグメントを置き換えるのではないと言っています。

あなたの主なアクティビティにフラグメントを追加する場所(コンテナ)を作成します。これは、ビューページのタイトルの隣にあるR.id.sliding_tabs,には絶対含まれていません。

+0

私は初心者ですので少し混乱しています。このコードは前に働いていたので、チュートリアルをステップバイステップで使用しました。 – Kemo

+0

答えを更新します –

+0

どこに断片を入れたいですか?ビューページャーで?下のビューページャ?どこ? –

関連する問題