-1
내가 몇 탭과 각 탭에서 내가 요소 중 하나를 누를 때마다

안드로이드 - 중첩 된 조각

그것은 충돌 다른 조각으로 나를 이끌 목록보기 (다른 목록보기)를 가지고 싶다을 가지고 노력하고

Android.java 파일의 ListView에 있습니다.

Android.java

다음
package com.example.tabs; 

import java.util.ArrayList; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class Android extends Fragment { 

private ArrayList<String> listOfElements; 
private ListView trackView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    final View android = inflater.inflate(R.layout.android_frag, container, false); 
    trackView = (ListView) android.findViewById(R.id.android_list); 
    listOfElements = new ArrayList<String>(); 
    listOfElements.add("Scott"); 
    listOfElements.add("james"); 
    listOfElements.add("mike"); 

    TrackAdapter trackAdapter = new TrackAdapter(getActivity(), listOfElements); 
    trackView.setAdapter(trackAdapter); 
    trackView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      // _mClickListener.onViewSelected(position, listOfTracks); 
      try { 
       Fragment videoFragment = new NestedAndroidFragment(); 
       FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
       transaction.addToBackStack(null); 
       transaction.replace(android.getId(), videoFragment); 
       transaction.commit(); 

      } catch (Exception e) { 
       Log.d("TabsApp", e.toString()); 
      } 
     } 
    }); 

    return android; 
} 
} 

내가 시작하는 방법입니다

android_frag.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" 
android:gravity="center" 
android:orientation="vertical" > 

    <ListView 
     android:id="@+id/android_list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

package com.example.tabs; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class NestedAndroidFragment extends Fragment { 
private ListView trackView; 
public NestedAndroidFragment() { 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.nested_frag, container, false); 
    trackView = (ListView) root.findViewById(R.id.nested_android_list); 
    return root; 
} 

/* private void destroyFragment() { 
    getChildFragmentManager().beginTransaction().hide(this).commit(); 
}*/ 
} 
01 NestedAndroidFragment.java

23,516,

nested_fragment.xml (I 거의 안드로이드 조각과 동일 넣어 - 그에 대한 좋은 예를 찾을 수 coulnd't)

는 는
<?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" 
android:gravity="center" 
android:orientation="vertical" > 

    <ListView 
     android:id="@+id/nested_android_list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 
</FrameLayout> 

는 사람이 전에 비슷한 일을했습니다 ? 도와 주셔서 감사합니다. 35 : 51.808 : E가/AndroidRuntime (28,384) FATAL EXCEPTION : 메인 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28,384) 로이드 여기

11-11 21 스택 트레이스이고 .content.res.Resources $ NotFoundException : 리소스 ID # 0xffffffff를 찾을 수 없습니다. 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : android.content.res.Resources.getResourceName (Resources.java:2639) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:919) 11-11 21 : 35 : 51.808 : E/AndroidRuntime 28384) : android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1104) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : android.support.v4.app.BackStackRecord.run (BackStackRecord.java:682) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384)) : android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1460) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : android.support.v4.app.FragmentManagerImpl $ 1. (FragmentManager.java:440) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : android.os.Handler.handleCallback (Handler.java:730) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : android.os.Handler.dispatchMessage (Handler.java:92) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : android.os.Looper.loop (Looper. java : 137) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : android.app.ActivityThread.main (ActivityThread.java:5419) 11-1 1 21 : 35 : 51.808 : E/AndroidRuntime (28384) : java.lang.reflect.Method.invokeNative (네이티브 메소드) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : java.lang. (Method.java:525) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1187) 11-11 21 : 35 : 51.808 : E/AndroidRuntime (28384) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1003) 11-11 21 : 35 : 51.808 : E/AndroidRuntime 28384) : at dalvik.system.NativeStart.main (네이티브 메소드)

+2

더 많은 코드! 더 많은 코드! 우리는 게으른 개발자를 위해 디버깅하는 것보다 더 좋은 방법이 없습니다! –

+0

오류 스택 트레이스를 표시 할 수 있습니까? 또한 질문과 관련이없는 코드 섹션을 삭제하십시오. Android.java와 android_frag.xml 만 시작해야합니다. – ucsunil

답변

0

android_frag.xml의 뷰 내용을 NestedAndroidFragment의 인스턴스로 바꾸려고합니다. 실제로 여기에 두 가지 오류가 있습니다. 충돌이 첫 번째 것입니다. 나는 곧 두 번째 것을 설명 할 것이다.

다음 행에서 수행하려는 작업이 잘못되었습니다.

transaction.replace(android.getId(), videoFragment); // you are trying to get the ID of the entire inflated view 
// you should be just using the id of the FrameLayout here 

조각에서는 루트 수준 컨테이너의 내용을 조각으로 바꿔야합니다. 당신이하려는 것은 조각 B가 조각 A 안에 존재하도록하지만 A의 모든 것을 대체하는 것입니다.이 패러다임이 어떻게 깨져 있는지 보시겠습니까? A를 동시에 교체하는 동안 B가 A 내부에 거주하도록 요청할 수 없습니다. 이것이 충돌의 원인입니다. 이 문제를 해결하는 것은 매우 간단합니다. 다음과 같이 android_frag.xml에서 FrameLayout이에 대한 id 속성을 추가

android:id="@+id/container" 

는 이제 Android.java로 돌아가서 당신과 대체 거래를 할 줄 대체 :

transaction.replace(R.id.container, videoFragment); // you can directly reference the id here 

이 뜻을 귀하의 충돌 문제를 해결하지만, 여기에 또 다른 문제점을 알 수 있습니다 - videoFragment의 내용이 ListView의 내용을 오버레이합니다. 그 이유는 조각을 사용하는 동안 안드로이드는 필요할 때 컨테이너를 채울 것을 기대하기 때문입니다. 하지만 당신은 XML에 정의 된 ListView 있습니다. 위젯이 xml에 정의되면 조각을 교체하는 것처럼 위젯을 대체하거나 제거 할 수 없습니다. 일단 그것이 xml에 있으면, xml이있는 모든 뷰에 항상있게됩니다. 귀하의 경우 가장 좋은 디자인은 귀하의 안드로이드 클래스를 ListFragment를 확장 한 다음 거기에서 물건을 가져가는 것입니다 (하지만 이것은 지금까지 무엇을 올려 놓은 것입니까?)이 방법이 다른 코드와 어떻게 상호 작용하는지 모르겠습니다. 그러므로 내 진술 만 받아들이면된다.)

지금 당장 가지고있는 문제를 해결하기위한 임시 방편으로, 조각으로 바꾸기 전에 ListView를 숨겨야합니다. 따라서 다음 줄을 onItemClick() 메서드에 추가하십시오.

trackView.setVisibility(View.GONE); // put this just before the replace statement 
// you can have it after the replace but in theory it would mean that the ListView would show up in the background for a fraction of a moment. 
// Might not be noticeable but just good to do it this way 
+0

감사합니다. 적어도 제가 한 걸음 더 나아갔습니다 ... 이것에 대한 더 많은 독서를 할 것입니다. 또는/그리고 제가 불분명 한 부분에 다시 충돌 할 경우 여기에 또 다른 질문을 추가 할 것입니다. 정말 고마워! – TommyLeeJones