2012-04-24 47 views
0

我使用Android的福尔摩斯,我试图实现片段在Android上的经典案例汇编片段例如:错误采用了android福尔摩斯

http://developer.android.com/guide/topics/fundamentals/fragments.html

但文件TitlesFragment.java在有一个错误,避免我的应用程序运行。我不知道为什么。

package com.android.fragmenttest; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.FragmentTransaction; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import com.actionbarsherlock.app.SherlockListFragment; 

public class TitlesFragment extends SherlockListFragment { 
    boolean mDualPane; 
    int mCurCheckPosition = 0; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     // Populate list with our static array of titles. 
     setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, Shakespeare.TITLES)); 

     // Check to see if we have a frame in which to embed the details 
     // fragment directly in the containing UI. 
     View detailsFrame = getActivity().findViewById(R.id.details); 
     mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE; 

     if (savedInstanceState != null) { 
      // Restore last state for checked position. 
      mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); 
     } 

     if (mDualPane) { 
      // In dual-pane mode, the list view highlights the selected item. 
      getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
      // Make sure our UI is in the correct state. 
      showDetails(mCurCheckPosition); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
      super.onSaveInstanceState(outState); 
      outState.putInt("curChoice", mCurCheckPosition); 
    } 

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

    // Helper function to show the details of a selected item, either by displaying a fragment in-place in the current UI, or starting a 
    // whole new activity in which it is displayed. 
    void showDetails(int index) { 
     mCurCheckPosition = index; 

     if (mDualPane) { 
      // We can display everything in-place with fragments, so update the list to highlight the selected item and show the data. 
      getListView().setItemChecked(index, true); 

      // Check what fragment is currently shown, replace if needed. 
      DetailsFragment details = (DetailsFragment) getFragmentManager().findFragmentById(R.id.details); 
      if (details == null || details.getShownIndex() != index) { 
       // Make new fragment to show this selection. 
       details = DetailsFragment.newInstance(index); 

       // 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 { 
      // Otherwise we need to launch a new activity to display the dialog fragment with selected text. 
      Intent intent = new Intent(); 
      intent.setClass(getActivity(), DetailsActivity.class); 
      intent.putExtra("index", index); 
      startActivity(intent); 
     } 
    } 
} 

Eclipse是哭的线路有:

View detailsFrame = getActivity().findViewById(R.id.details); 

和:

DetailsFragment details = (DetailsFragment) getFragmentManager().findFragmentById(R.id.details); 

和:

ft.replace(R.id.details, details); 

因此,R.id.details是个 问题。类DetailsFragment.java定义如下:

package com.android.fragmenttest; 

import android.os.Bundle; 
import android.util.TypedValue; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ScrollView; 
import android.widget.TextView; 

import com.actionbarsherlock.app.SherlockFragment; 

public class DetailsFragment extends SherlockFragment { 
    // Create a new instance of DetailsFragment, initialized to show the text at 'index'. 
    public static DetailsFragment newInstance(int index) { 
     DetailsFragment f = new DetailsFragment(); 

     // Supply index input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("index", index); 
     f.setArguments(args); 

     return f; 
    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     if (container == null) { 
      // We have different layouts, and in one of them this fragment's containing frame doesn't exist. The fragment 
      // may still be created from its saved state, but there is no reason to try to create its view hierarchy because it 
      // won't be displayed. Note this is not needed -- we could just run the code below, where we would create and return 
      // the view hierarchy; it would just never be used. 
      return null; 
     } 
     ScrollView scroller = new ScrollView(getActivity()); 
     TextView text = new TextView(getActivity()); 
     int padding = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getActivity().getResources().getDisplayMetrics()); 
     text.setPadding(padding, padding, padding, padding); 
     scroller.addView(text); 
     text.setText(Shakespeare.DIALOGUE[getShownIndex()]); 
     return scroller; 
    } 
} 

有谁知道为什么Eclipse中没有让这个片段例如编译?

+0

当您不包含错误日志时,您如何期待任何人的帮助?来吧! – 2012-04-24 22:32:17

+0

抱歉,那是我的第一个话题。感谢您的建议。 – graffiti75 2012-05-29 17:54:37

回答

3

使用时应该是getSherlockActivity();getSupportFragmentManager(); ActionbarSherlock。

+0

哦,就是这样!谢谢您的帮助。 – graffiti75 2012-05-29 17:53:56

+0

@ graffiti75选择这个答案的正确答案是你应该采取的方法,而不是评论“这就是它!” – Dallas 2013-04-24 14:17:48

相关问题