2014-11-26 2 views
1

필자는이 튜토리얼을 사용하여 내 프로젝트에 내 세로/가로 세그먼트를 해결하기 위해 노력 : http://www.cs.dartmouth.edu/~campbell/cs65/lecture09/lecture09.html응용 프로그램 충돌이

모든 것이 잘 (가로 및 세로 모두)를 작동하는 것 같다,하지만 오류

11-26 13:42:38.822 22594-22594/picturedtalk.com.picturedtalk E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: picturedtalk.com.picturedtalk, PID: 22594 
java.lang.RuntimeException: Unable to start activity ComponentInfo{picturedtalk.com.picturedtalk/picturedtalk.com.picturedtalk.Signs.SignActivity}: android.app.Fragment$InstantiationException: Unable to instantiate fragment picturedtalk.com.picturedtalk.Signs.DetailsFragment: make sure class name exists, is public, and has an empty constructor that is public 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2338) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3930) 
     at android.app.ActivityThread.access$900(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1327) 
     at android.os.Handler.dispatchMessage(Handler.java:110) 
     at android.os.Looper.loop(Looper.java:193) 
     at android.app.ActivityThread.main(ActivityThread.java:5292) 
     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:824) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment picturedtalk.com.picturedtalk.Signs.DetailsFragment: make sure class name exists, is public, and has an empty constructor that is public 
     at android.app.Fragment.instantiate(Fragment.java:601) 
     at android.app.FragmentState.instantiate(Fragment.java:98) 
     at android.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1759) 
     at android.app.Activity.onCreate(Activity.java:899) 
     at picturedtalk.com.picturedtalk.Signs.SignActivity.onCreate(SignActivity.java:16) 

가로보기 세로에서 변경할 때 내가 충돌에서 응용 프로그램을 중지 할 수있는 방법을 어떤 제안 : 난 세로에서이와 함께 응용 프로그램 충돌시 가로 또는 비자로 회전하는 경우?

내 응용 프로그램의 일부 :

SignActivity.java

public class SignActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.signs_layout); 

} 

}

ListFragment.java

public class ListFragment extends android.app.ListFragment { 

private ArrayList<Signs> storage; 
boolean mDualPane; 
int mCurrentCheckPosition = 0; 


@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    SignAdapter adapter = new  
SignAdapter(Storage.get(getActivity()).getStorageOfSigns()); 
    setListAdapter(adapter); 

    //Check if the we are using layout-land version of the XML to figure out if 
portrait/landscape 
    View detailsFrame = getActivity().findViewById(R.id.details); 
    mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE; 

    //restore last state 
    if (savedInstanceState != null) { 
     mCurrentCheckPosition = savedInstanceState.getInt("curChoice", 0); 
    } 

    if (mDualPane) { 
     //only select one item at the time 
     getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     showDetails(mCurrentCheckPosition); 

    } else { 
     getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     getListView().setItemChecked(mCurrentCheckPosition, true); 
    } 


} 

//Handle flipping during fragment use 
//DOES NOT WORK 
@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    savedInstanceState.putInt("curChoice", mCurrentCheckPosition); 
} 

private void showDetails(int index) { 
    mCurrentCheckPosition = index; 

    if (mDualPane) { 

     getListView().setItemChecked(index, true); 
     DetailsFragment details = (DetailsFragment) getFragmentManager().findFragmentById(R.id.details); 
     if (details == null || details.getShownIndex() != index) { 

      UUID startId = ((SignAdapter) getListAdapter()).getItem(0).getId(); 
      details = new DetailsFragment(startId); 

      // Execute a transaction, replacing any existing fragment 
      // with this one inside the frame. 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      ft.replace(R.id.details, details); 
      ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
      ft.commit(); 
     } 

    } else { 

     Intent intent = new Intent(); 
     intent.setClass(getActivity(), DetailsActivity.class); 
     intent.putExtra("index", index); 
     startActivity(intent); 
    } 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 

    if(!mDualPane){ 
    Signs signs = ((SignAdapter) getListAdapter()).getItem(position); 
    Intent intent = new Intent(getActivity(), 
picturedtalk.com.picturedtalk.Signs.DetailsActivity.class); 
    intent.putExtra(DetailsFragment.EXTRA_SIGN_ID, signs.getId()); 
    startActivity(intent); 
    } 
    else{ 
    UUID signId = ((SignAdapter) getListAdapter()).getItem(position).getId(); 
    DetailsFragment fragment = new DetailsFragment(signId); 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.details, fragment); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     ft.commit(); 
    } 
} 


private class SignAdapter extends ArrayAdapter<Signs> { 

    public SignAdapter(ArrayList<Signs> sSigns) { 
     super(getActivity(), 0, sSigns); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     //If we were given a view, inflate one 
     if (convertView == null) { 
      convertView = getActivity().getLayoutInflater().inflate(R.layout.signs_row, 
null); 
     } 
     //Configure the view for this Crime 
     Signs signs = getItem(position); 
     TextView titleTextView = (TextView) convertView.findViewById(R.id.label); 
     titleTextView.setText(signs.getName()); 

     return convertView; 
    } 
}} 

DetailsActivity.java

public class DetailsActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     UUID mSignId; 
     mSignId = (UUID)getIntent().getSerializableExtra(DetailsFragment.EXTRA_SIGN_ID); 
     DetailsFragment details = new DetailsFragment(mSignId); 
     getFragmentManager().beginTransaction().replace(android.R.id.content, details).commit(); 
     UUID STOPTHIs = mSignId; 
    } 
    else { 
     UUID mSignId; 
     mSignId = (UUID)getIntent().getSerializableExtra(DetailsFragment.EXTRA_SIGN_ID); 
     DetailsFragment details = new DetailsFragment(mSignId); 
     getFragmentManager().beginTransaction().add(android.R.id.content, details).commit(); 
    } 



}} 
,

DetailsFragment.java

public class DetailsFragment extends Fragment { 

public int getShownIndex() { 
    return getArguments().getInt("index", 0); 
} 

public static final String EXTRA_SIGN_ID = "sign_id"; 
private UUID extraSignId; 
// private static DetailsFragment detailsFragment; 
private View view; 
private TextView title; 
private ImageView illustrativeView; 
private ImageView pictureView; 
private VideoView videoView; 
private Signs mSign; 
private String TAG = "DETAILFRAGMENT"; 

public DetailsFragment(UUID signId) { 
    this.extraSignId = signId; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mSign = Storage.get(getActivity()).getSigns(extraSignId); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    view = inflater.inflate(R.layout.signs_details, container, false); 

    title = (TextView) view.findViewById(R.id.title); 
    illustrativeView = (ImageView) view.findViewById(R.id.illustrateImage); 
    pictureView = (ImageView) view.findViewById(R.id.pictureImage); 
    videoView = (VideoView) view.findViewById(R.id.videoView); 

    title.setText(mSign.getName()); 

    try { 
     Bitmap illuBitmap = BitmapFactory.decodeFile(mSign.getIllustrativeURL()); 
     illustrativeView.setImageBitmap(illuBitmap); 
    } catch (Exception e) { 
     Log.d(TAG, "failed loading illustrative image"); 
    } 
    try { 
     Bitmap picBitmap = BitmapFactory.decodeFile(mSign.getImageURL()); 
     pictureView.setImageBitmap(picBitmap); 
    } catch(Exception e){ 
     Log.d(TAG, "failed loading picture image"); 
    } 

    try { 

     Uri uri = Uri.parse(mSign.getVideoURL()); 
     videoView.setVideoURI(uri); 
     videoView.requestFocus(); 

     videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mp.setLooping(true); 
      } 
     }); 

     videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
      @Override 
      public boolean onError(MediaPlayer mp, int what, int extra) { 

       videoView.setBackgroundResource(R.drawable.simp); 
       return true; 
      } 
     }); 
     videoView.start(); 

    } catch (Exception e) { 
     Log.d(TAG, "failed loading video"); 
    } 



    return view; 
}} 

Signs.java

public class Signs { 

UUID id; 
String name; 
String videoURL; 
String imageURL; 
String illustrativeURL; 

public Signs(String name, String imageURL,String videoURL, String illustrativeURL){ 
    this.id = UUID.randomUUID(); 
    this.name = name; 
    this.videoURL = videoURL; 
    this.imageURL = imageURL; 
    this.illustrativeURL = illustrativeURL; 
} 

public UUID getId() { 
    return id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getVideoURL() { 
    return videoURL; 
} 

public void setVideoURL(String videoURL) { 
    this.videoURL = videoURL; 
} 

public String getImageURL() { 
    return imageURL; 
} 

public void setImageURL(String imageURL) { 
    this.imageURL = imageURL; 
} 

public String getIllustrativeURL() { 
    return illustrativeURL; 
} 

public void setIllustrativeURL(String illustrativeURL) { 
    this.illustrativeURL = illustrativeURL; 
}} 

signs_layout.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" > 

<fragment 
    android:id="@+id/titles" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="picturedtalk.com.picturedtalk.Signs.ListFragment" /> 

signs_layout.xml (/ 레이아웃 랜드)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:baselineAligned="false" 
android:orientation="horizontal" > 

<fragment 
    android:id="@+id/titles" 
    android:layout_width="0px" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    class="picturedtalk.com.picturedtalk.Signs.ListFragment" /> 

<FrameLayout 
    android:id="@+id/details" 
    android:layout_width="0px" 
    android:layout_height="match_parent" 
    android:layout_weight="3" 
    android:background="?android:attr/detailsElementBackground" /> 

</LinearLayout> 

signs_details.xml

<?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="fill_parent" > 


<TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:textSize="50dp" 
android:text="TitleHere" 
android:id="@+id/title" 
android:layout_alignParentTop="true" 
android:layout_centerHorizontal="true" 
android:layout_marginTop="98dp" /> 

<ImageView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/illustrateImage" 
android:layout_below="@id/title" 
android:layout_toRightOf="@+id/pictureImage" 
android:background="@drawable/signs_logo"/> 

<ImageView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/pictureImage" 
android:layout_centerVertical="true" 
android:layout_below="@+id/title" 
android:layout_centerHorizontal="true" 
android:background="@drawable/simp"/> 

<VideoView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/videoView" 
android:layout_below="@id/title" 
android:layout_toLeftOf="@+id/pictureImage"/> 
</RelativeLayout> 

signs_listview.xml

<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/listview" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" /> 

signs_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" > 

<TextView 
    android:id="@+id/label" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@+id/label" 
    android:textSize="20px" > 
</TextView> 

</LinearLayout> 

답변

2

당신은 응용 프로그램의 매니페스트 파일에 다음을 추가하여 활동 휴양을 피할 수 있습니다.

android:configChanges="keyboardHidden|orientation|screenSize" 

<activity 
      android:name=".your activity" 
      android:configChanges="orientation|keyboardHidden|screenSize" 
      android:label="@string/app_name" > 
     </activity> 
+0

오 남자 SOOO 감사합니다! 그게 해결 됐어! 방금 manifest에있는 앱의 해당 부분에 대한 두 가지 액티비티 클래스에 configChange를 추가했습니다. – svennand

+0

아니요, 대답을 수락하기 위해 기다렸다가 그 중 하나를 선택해야했습니다. 그 다음에 나는 upvote하려고했지만 충분한 "포인트"voteup 15 뭔가 평판 뭔가, -1 단지 .... wtf로 변경된 다음 일이 필요 없다는 오류가있어! – svennand

+0

여전히 "투표 업은 15 평판이 필요합니다"라는 빨간색 배너와 동일한 오류가 발생하면 숫자는 0으로 돌아가고 -1로 되돌아갑니다. Facepalm, stackoverflow 내 첫 경험을 어디에 책상에 머리를 두드리는없이 내 문제에 대한 정말 깨끗하고 간단한 수정을 얻을.그리고 괴물 "고마워요"시스템이 나를 도청하고 있습니다 ... – svennand