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 
    } 
}