1

我有持有片段的活動,它通過在OnCreate做這個(從谷歌的例子)增加了它:訪問片段的觀點,從活動

// Check that the activity is using the layout version with 
    // the fragment_container FrameLayout 
    if (findViewById(R.id.fragment_container) != null) { 

     // However, if we're being restored from a previous state, 
     // then we don't need to do anything and should return or else 
     // we could end up with overlapping fragments. 
     if (savedInstanceState != null) { 
      return; 
     } 

     // Create a new Fragment to be placed in the activity layout 
     RecordFragment firstFragment = new RecordFragment(); 

     // In case this activity was started with special instructions from an 
     // Intent, pass the Intent's extras to the fragment as arguments 
     firstFragment.setArguments(getIntent().getExtras()); 

     // Add the fragment to the 'fragment_container' FrameLayout 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.fragment_container, firstFragment).commit(); 

這是活動佈局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/fragment_container" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 

這是片段:

public class RecordFragment extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_record, container, false); 
} 

而且fragment_record.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/LinearLayout1" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.controlcenter.RecordActivity$PlaceholderFragment" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Information:" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <EditText 
     android:id="@+id/action_info" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:ems="10" /> 

    <ImageView 
     android:id="@+id/arrow_button" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:src="@drawable/ic_action_forward" /> 

</LinearLayout> 

在片段有一個箭頭按鈕。我想活動的監聽器添加到按鈕,所以當它被點擊的片段會滑出而另一個片段將在滑動。 林無法正常訪問該按鈕,我試圖用

firstFragment.getView().findViewById(R.id.arrow_button) 

但它看起來getView返回null,雖然我重載了onCreateView()方法。

+0

我增加了XML。 – Yuval

回答

3

簡單的答案是,你不。將片段的視圖看作片段內部的東西。相反,通過您定義的接口將活動設置爲Fragment的偵聽器,然後將片段中的單擊偵聽器設置爲調用片段的偵聽器。

public class MyFragment extends Fragment { 
    public interface MyListener { 
     public void onAction(); 
    } 

    private MyListener mListener; 
    public void setListener(MyListener listener) { 
     mListener = listener; 
    } 

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

     root.findViewById(R.id.arrow_button).setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (mListener != null) { 
        mListener.onAction(); 
       } 
      } 
     }); 
     return root; 
    } 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     if (activity instanceof MyListener) { 
      mListener = (MyListener) activity; 
     } else { 
      // Maybe throw an exception if you want to be strict 
     } 
    } 
} 

和你的Activity類就需要這樣的:

public class MyActivity extends Activity implements MyFragment.MyListener { 
    public void onAction() { 
     // TODO whatever you need to do when the button is clicked 
    } 
}