【问题标题】:Add buttons / functions to different views on viewpager layouts?在 viewpager 布局的不同视图中添加按钮/功能?
【发布时间】:2017-03-12 20:00:51
【问题描述】:

我对视图页面/其中显示的不同布局有点绝望。

总结:切换不同的布局效果很好。现在我想在不同的布局上实现按钮/功能,这是行不通的。

我有以下功能良好的浏览器。它遍历布局列表并显示不同的布局。

我的活动

public static final String LOG_TAG = MainActivity.class.getSimpleName();

private ViewPager viewPager;
private ViewPagerAdapter viewPagerAdapter;
private LinearLayout dotsLayout;
private TextView[] dots;
private int[] layouts;
private Button btnSkip, btnNext;

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


    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_swipe);

    viewPager = (ViewPager) findViewById(R.id.view_pager);
    dotsLayout = (LinearLayout) findViewById(R.id.layoutDots);
    //btnSkip = (Button) findViewById(R.id.btn_skip);
    btnNext = (Button) findViewById(R.id.btn_next);

    layouts = new int[] {
        R.layout.activity_mmg_description_start,
            R.layout.activity_mmg_question_1,
            R.layout.activity_mmg_question_2,
            R.layout.activity_mmg_question_3,
            R.layout.activity_mmg_question_4,
            R.layout.activity_mmg_question_5,
            R.layout.activity_mmg_question_6,
            R.layout.activity_mmg_question_7,
            R.layout.activity_mmg_question_8,
            R.layout.activity_mmg_question_9,
            R.layout.activity_mmg_question_10,
            R.layout.activity_mmg_question_11,
            R.layout.activity_mmg_question_12,
            R.layout.activity_mmg_question_13,
            R.layout.activity_mmg_question_14
    };

    // adding bottom dots
    addBottomDots(0);

    viewPagerAdapter = new ViewPagerAdapter();
    viewPager.setAdapter(viewPagerAdapter);
    viewPager.addOnPageChangeListener(viewPagerPageChangeListener);


}

@
Override
public void onBackPressed() {}

public void btnNextClick(View v) {
    // checking for last page
    // if last page home screen will be launched
    int current = getItem(1);
    if (current < layouts.length) {
        // move to next screen
        viewPager.setCurrentItem(current);
    } else {
        launchHomeScreen();
    }
}

ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {

    @
    Override
    public void onPageSelected(int position) {
        addBottomDots(position);

        // changing the next button text 'NEXT' / 'GOT IT'
        if (position == layouts.length - 1) {
            // last page. make button text to GOT IT
            btnNext.setText(getString(R.string.start_measurement_manual));
            //btnSkip.setVisibility(View.GONE);
        } else {
            // still pages are left
            btnNext.setText(getString(R.string.next));
            //btnSkip.setVisibility(View.VISIBLE);
        }
    }

    @
    Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {

    }

    @
    Override
    public void onPageScrollStateChanged(int arg0) {

    }
};


private void addBottomDots(int currentPage) {
    dots = new TextView[layouts.length];

    dotsLayout.removeAllViews();
    for (int i = 0; i < dots.length; i++) {
        dots[i] = new TextView(this);
        dots[i].setText(Html.fromHtml("&#8226;"));
        dots[i].setTextSize(35);
        dots[i].setTextColor(getResources().getColor(R.color.dot_inactive));
        dotsLayout.addView(dots[i]);
    }

    if (dots.length > 0)
        dots[currentPage].setTextColor(getResources().getColor(R.color.dot_active));
}


private int getItem(int i) {
    return viewPager.getCurrentItem() + i;
}

private void launchHomeScreen() {
    startActivity(new Intent(this, ManualActivity.class));
    finish();
}

public class ViewPagerAdapter extends PagerAdapter {
    private LayoutInflater layoutInflater;


    public ViewPagerAdapter() {

    }

    @
    Override
    public Object instantiateItem(ViewGroup container, int position) {


        //Inflate the correct layout
        layoutInflater = (LayoutInflater) getSystemServ**Option 1: starting with layout activity_mmg_question_1**ice(Context.LAYOUT_INFLATER_SERVICE);

        //layouts[] is an int[] that points to resources such as R.layout.start_page
        View inflatedView = layoutInflater.inflate(layouts[position], container, false);

        ((ViewPager) container).addView(inflatedView, 0);

        switch (position) {
            case R.layout.activity_mmg_description_start:
                Log.d(LOG_TAG, "QD " + "Firstviewcame");

            case R.layout.activity_mmg_question_1:
                //LinearLayout linearLayout_mmg_1 = (LinearLayout)inflatedView.findViewById(R.id.linearlayout_mmg_1);

                Button testButton = (Button) findViewById(R.id.testbutton);

                testButton.setOnClickListener(new View.OnClickListener() {

                    @
                    Override
                    public void onClick(View v) {
                        Log.d(LOG_TAG, "QD " + "Swipebuttonclicked");
                    }
                });


        }

        return inflatedView;
    }

    @
    Override
    public int getCount() {
        return layouts.length;
    }

    @
    Override
    public boolean isViewFromObject(View view, Object obj) {
        return view == obj;
    }


    @
    Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        View view = (View) object;
        container.removeView(view);
    }
}

我想为不同的布局添加功能。在布局上:activity_mmg_question_1 是一个按钮(R.id.testbutton),应该写一条日志消息。

我尝试了几个选项。

选项1:从布局activity_mmg_question_1开始

在开头将 R.layout.activity_mmg_description_start 注释掉:

    layouts = new int[]{
            //R.layout.activity_mmg_description_start,
            R.layout.activity_mmg_question_1,

以下代码有效:

    @Override
    public Object instantiateItem(ViewGroup container, int position) {


        //Inflate the correct layout
        layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        //layouts[] is an int[] that points to resources such as R.layout.start_page
        View inflatedView = layoutInflater.inflate(layouts[position], container, false);

        ((ViewPager)container).addView(inflatedView,0);

        LinearLayout linearLayout_mmg_1 = (LinearLayout)inflatedView.findViewById(R.id.linearlayout_mmg_1);

        Button testButton = (Button)findViewById(R.id.testbutton);

        testButton.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Log.d (LOG_TAG, "QD " + "Swipebuttonclicked");
                    }
                });

        return inflatedView;
    }

很容易理解:它使布局膨胀,找到按钮,工作。

选项 2:从布局开始 activity_mmg_description_start

以R.layout.activity_mmg_description_start开头:

    layouts = new int[]{
            R.layout.activity_mmg_description_start,
            R.layout.activity_mmg_question_1,

最后是一个

FATAL EXCEPTION: main
[...]
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference

我想我也得到了这个:在第一个布局 (R.layout.activity_mmg_description_start) 上它没有找到按钮,所以它指向 null,并且出现了错误。

如何预防?这让我想到了:

选项 3:switch-case

显示不同的布局有效,但按钮的日志消息不起作用。

@Override
public Object instantiateItem(ViewGroup container, int position) {


    //Inflate the correct layout
    layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    //layouts[] is an int[] that points to resources such as R.layout.start_page
    View inflatedView = layoutInflater.inflate(layouts[position], container, false);

    ((ViewPager)container).addView(inflatedView,0);

    switch (position){
    case R.layout.activity_mmg_description_start:
        Log.d (LOG_TAG, "QD " + "Firstviewcame");

    case R.layout.activity_mmg_question_1:
        //LinearLayout linearLayout_mmg_1 = (LinearLayout)inflatedView.findViewById(R.id.linearlayout_mmg_1);

        Button testButton = (Button)findViewById(R.id.testbutton);

        testButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Log.d (LOG_TAG, "QD " + "Swipebuttonclicked");
        }
        });


    }

    return inflatedView;
}

有人有想法或解决方案吗?

最好的,提前致谢,

虎码

【问题讨论】:

  • 我认为您应该考虑为这些布局使用不同的片段,然后在片段内部处理点击。

标签: android android-layout android-viewpager


【解决方案1】:

我认为你应该使用Fragments

在调用之前尝试setOnClickListener ((ViewPager)container).addView(inflatedView,0);

public Object instantiateItem(ViewGroup container, int position) {


//Inflate the correct layout
layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

//layouts[] is an int[] that points to resources such as R.layout.start_page
View inflatedView = layoutInflater.inflate(layouts[position], container, false);


switch (position){
case R.layout.activity_mmg_description_start:
    Log.d (LOG_TAG, "QD " + "Firstviewcame");

case R.layout.activity_mmg_question_1:
    //LinearLayout linearLayout_mmg_1 = (LinearLayout)inflatedView.findViewById(R.id.linearlayout_mmg_1);

    Button testButton = (Button)findViewById(R.id.testbutton);

    testButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Log.d (LOG_TAG, "QD " + "Swipebuttonclicked");
    }
    });


}

((ViewPager)container).addView(inflatedView,0);

return inflatedView;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2011-10-19
    相关资源
    最近更新 更多