Активность кнопки с помощью viewPager?

Пожалуйста, не судите меня, я новичок в разработке для Android... Я хочу сделать приложение с viewPager... У меня есть три страницы с тремя разными макетами... Но я просто не мог понять, как для работы с кнопкой на второй странице в viewPager. Я нашел этот вопрос: «Как написать метод кнопки onClick в viewpager? "и установите мои коды следующим образом:

ViewPagerAdapter:

@Override
public Object instantiateItem( View pager, int position )
{
    View v = new View(pager.getContext());
    LayoutInflater inflater =
            (LayoutInflater) pager.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    int resId = 0;
    switch (position) {
    case 0:         
        resId = R.layout.deneme;            
        break;
    case 1:
        resId = R.layout.deneme2;          
        break;
    case 2:
        resId = R.layout.deneme3;
        break;   
    }

    v = inflater.inflate(resId, null);
    ((ViewPager) pager).addView(v, 0);

    return v;
  }

Здесь я получаю ошибки: «Метод findViewById (int) не определен для типа new View.OnClickListener () {}» в строке

 LinearLayout l = (LinearLayout) findViewById(R.id.layout2); 

и "Метод getResources() не определен для типа new View.OnClickListener(){}" в строке

 l.setBackgroundDrawable(getResources().getDrawable(R.drawable.background));

Главное:

 public class ViewPagerProjectActivity extends Activity {

 Button btn;
 View deneme2lout;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ViewPagerAdapter adapter = new ViewPagerAdapter( this );
    ViewPager pager = (ViewPager)findViewById( R.id.viewpager );
    pager.setAdapter( adapter );
    pager.setCurrentItem(0);


    LayoutInflater getView = getLayoutInflater();
    deneme2lout = (View) getView.inflate(R.layout.deneme2,null);      
    btn = (Button) deneme2lout.findViewById(R.id.button1);

}

public void buttonClick(View v) {
    if(v.equals(btn)) {
    deneme2lout.setBackgroundDrawable(getResources().getDrawable(R.drawable.background));
    }
}

 }

Итак, как я понимаю, я не могу использовать эти два кода... Итак, как мне это сделать? Мне нужно изменить фон второй страницы при нажатии кнопки на втором макете.

А вот мои коды deneme2.xml:

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="175dp"
        android:layout_height="95dp"
        android:layout_x="69dp"
        android:layout_y="174dp"
        android:textSize="25dp"
        android:text="Change" />

</AbsoluteLayout>

person yahya    schedule 01.02.2012    source источник
comment
Спасибо, ваш код помог мне.   -  person Lucifer    schedule 11.06.2014
comment
Рад это слышать :) @Kedarnath   -  person yahya    schedule 12.06.2014


Ответы (3)


Это потому, что, как объясняется, у OnClickListener нет этих двух методов, которые вы используете внутри OnClickListener. Заменять:

LinearLayout l = (LinearLayout) findViewById(R.id.layout2);

с участием

LinearLayout l = (LinearLayout) v.findViewById(R.id.layout2);

если затем он говорит, что v должен быть окончательным, все должно быть в порядке. И заменить:

getResources().getDrawable(R.drawable.background)

с участием

ViewPagerAdapter.this.context.getResources().getDrawable(R.drawable.background)
person Alex Curran    schedule 01.02.2012
comment
Спасибо, сработало =) Но теперь я получаю исключение NullPointerException в этой строке: btn.setOnClickListener( ... ); Вероятно, это потому, что я не нахожусь в том же макете с кнопкой... Но не мог понять, как это исправить... Любые предложения? - person yahya; 01.02.2012
comment
хм, ну, вы все еще используете представление v, так что все должно быть в порядке... вы уверены, что button1 и layout2 существуют в этом макете? Кроме того, ваш код в настоящее время фактически не добавляет View v с OnClickListener, установленным на страницу, он добавляет View view. Попробуйте изменить его так, чтобы он добавлял v для верхнего регистра и view для двух нижних, и посмотрите, сработает ли он тогда. - person Alex Curran; 01.02.2012
comment
Вы правы :) Я внес изменения, о которых вы упомянули, и теперь он не выдает никакой ошибки ... Но при нажатии он также не меняет фон: / Что еще мне делать? (Извините за беспокойство, но, как я уже сказал, я очень новичок в Android) - person yahya; 02.02.2012
comment
не беспокойся! Я не могу в данный момент понять, почему это не сработает. Не могли бы вы обновить весь код в вопросе тем, что у вас есть сейчас, и опубликовать свой файл deneme.xml (или любой другой файл, содержащий layout2), пожалуйста? - person Alex Curran; 02.02.2012
comment
хм, это действительно странно, поскольку я до сих пор не понимаю, почему это не сработает. Попробуйте изменить l.setBackgroundDrawable(ViewPagerAdapter.this.context.getResources().getDrawable(R.drawable.background)); на l.setBackgroundResource(R.drawable.background);, это не должно иметь никакого значения, но кто знает! - person Alex Curran; 02.02.2012
comment
Тоже не работал. Должен ли я делать какие-либо действия? или что-то? Как я вижу, это должно работать так, но..? - person yahya; 02.02.2012
comment
У меня такая же проблема с просмотрщиком. Он не позволяет нажимать кнопки. - person Kala J; 07.10.2014

Что касается второй части вашего вопроса, то она проста! Хотя теперь вы все время используете View v, вы по-прежнему «переписываете» его с новой инфляцией в конце:

int resId = 0;
switch (position) {
case 0:         
    resId = R.layout.deneme;

    break;
case 1:
    resId = R.layout.deneme2;
    // Inflate v the first time
    v = inflater.inflate(R.layout.deneme2, null, false);
    @SuppressWarnings("deprecation")
    final AbsoluteLayout l = (AbsoluteLayout) v.findViewById(R.id.layout2);  
    // Add the OnClickListener to the button, which is associated with the above instance of v       
    btn = (Button) v.findViewById(R.id.button1);
    btn.setOnClickListener( new OnClickListener() {
        public void onClick(View m) {
            l.setBackgroundResource(R.drawable.background);
        }
    });
    break;
case 2:
    resId = R.layout.deneme3;
}

// Overwrite the instance of v with the OnClickListener with one without the OnClickListener
v = inflater.inflate(resId, null);
((ViewPager) pager).addView(v, 0);

return v;

Таким образом, изменение следующих битов должно заставить его работать идеально:

  • Изменить View v = new View(pager.getContext()); на View v = null;
  • Измените окончательную инфляцию (непосредственно перед добавлением представления) на if (v == null) v = inflater.inflate(resId, null);
person Alex Curran    schedule 02.02.2012
comment
Большое спасибо! Работает как шарм! знак равно - person yahya; 02.02.2012
comment
Но могу я спросить, есть ли способ справиться с нажатием кнопки в основном классе, а не в PagerAdapter? - person yahya; 02.02.2012

В ответ на ваш последний вопрос вы можете установить прослушиватель onClick вне адаптера и внутри действия следующим образом:

public void buttonClick(View v) {
    //do something

}

В вашем xml, содержащем кнопку, убедитесь, что у вас есть android:onClick="buttonClick" как 1 из свойств.

В вашем xml, содержащем кнопку, убедитесь, что у вас есть android:onClick="buttonClick" как 1 из свойств.

Изменить -- я не думаю, что вы применили изменения, которые я предложил из вашего последнего кода... вот что я подумал:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ViewPagerAdapter adapter = new ViewPagerAdapter( this );
    ViewPager pager = (ViewPager)findViewById( R.id.viewpager );
    pager.setAdapter( adapter );
    pager.setCurrentItem(0);


    LayoutInflater getView = getLayoutInflater();
    deneme2lout = (View) getView.inflate(R.layout.deneme2,null);      

}

public void buttonClick(View v) {
    deneme2lout.setBackgroundDrawable(getResources().getDrawable(R.drawable.background));
}

Если это не так, сообщите нам об ошибке, чтобы мы могли указать вам правильное направление.

person aimango    schedule 02.02.2012
comment
Не могли бы вы проверить мой ответ, пожалуйста? Я публикую свои коды, переупорядоченные, как вы сказали ... Но все еще не работает. - person yahya; 03.02.2012
comment
Я предполагаю, что у вас все еще есть проблемы, потому что вы получаете исключение NullPointer в операторе if. Вам не нужно добавлять оператор if в метод buttonClick, чтобы проверить, является ли представление кнопкой (это избыточно). Метод buttonClick будет вызываться, если кто-то нажмет эту кнопку. Из-за этого я думаю, что deneme2lout.setBackgroundDrawable(R.drawable.background); все должно быть в порядке. Дайте мне знать, если это работает. - person aimango; 03.02.2012
comment
Я пробовал, но не получилось... и я редактирую свои коды, вы можете проверить это там... заранее спасибо! - person yahya; 03.02.2012
comment
Неа, не получилось... Ошибки не выдает, но и по клику тоже не работает. - person yahya; 04.02.2012