处理Fragment中的视图点击而不是Activity

时间:2014-10-04 11:40:32

标签: android android-viewpager fragment fragmentstatepageradapter

我正在使用ViewPagerFragmentStatePagerAdapterFragment。 如何使用它的功能(首次初始化,按钮处理程序)加载每个片段?

我设法让按钮工作,但我必须移动主要活动中的所有句柄。如何在片段中保留功能?

这是我的适配器:

public class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter {
    public DemoCollectionPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        Fragment fragment = new DemoObjectFragment();
        Bundle args = new Bundle();
        // Our object is just an integer :-P
        args.putInt(DemoObjectFragment.ARG_OBJECT, i + 1);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {

        switch (position) {
            case 0: return "A";
            case 1: return "B";
            case 2: return "C";
        }

        return "Tab " + (position + 1);
    }
}

这是片段:

public class DemoObjectFragment extends Fragment {
    public static final String ARG_OBJECT = "object";
    int mNum;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // The last two arguments ensure LayoutParams are inflated
        // properly.
        View rootView = inflater.inflate(R.layout.activity_page, container, false);

        //((TextView) rootView.findViewById(android.R.id.text1)).setText(
        //        Integer.toString(args.getInt(ARG_OBJECT)));
        return rootView;
    }

    /**
     * When creating, retrieve this instance's number from its arguments.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments() != null ? getArguments().getInt("num") : 1;
    }

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

更新 这是 activity_page.xml

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >


    <LinearLayout
        android:id="@+id/panel_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:background="#fffaffff"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context=".GuessActivity">


        <TextView
            android:id="@+id/text1"
            android:text="@string/lorem_ipsum"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/button_validate"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/guess_height"
            android:layout_alignParentRight="true"
            android:onClick="validateGuess"
            android:text="@string/button_validate" />

        <TextView
            android:id="@+id/text2"
            android:text="@string/guess_success"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="#008000"
            android:visibility="gone"/>


    </LinearLayout>
</FrameLayout>

1 个答案:

答案 0 :(得分:1)

您的问题似乎并不是真正的滑动,而是如何将与特定屏幕相关的代码组合在一起。

目前,您在活动布局中使用onClick属性,在要处理点击的元素上。此属性的合约需要在您的活动中使用公共void方法,将单个View对象作为参数,并使用与该属性值相同的名称。例如。如果你有:

<View ...
  android:onClick="onButtonPress" />

您需要在活动中使用相应的方法:

public void onButtonPress(View view) {
    ...
}

假设您的每个片段都有不同的UI(不同的XML布局),并且您希望将每个片段的逻辑保留在片段中,我将从更严格的命名约定开始。

目前,您的DemoObjectFragment的布局称为activity_page.xml。考虑为您将在活动中使用的布局保留activity_前缀。相反,请尝试fragment_demo_object.xml此特定片段。

您在onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)中实例化此片段的布局是正确的。在您返回根视图之前,您可以像过滤一样找到您的视图,但它们已被注释掉。

private Button validateButton;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.activity_page, container, false);
    validateButton = (Button) rootView.findById(R.id.button_validate);
    return rootView;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    validateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            validateInput();
        }
    });
}

private void validateInput() {
    // validate whatever you want to validate
}

在这种情况下,特定片段上的UI逻辑仅在该片段上。