마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

[8시간째..] 도데체 왜 안돼는지 이유를 잘 모르겠어요.......

0 추천

안녕하세요..

뷰페이저에서 각 페이지를 눌렀을때 각 페이지의 이미지마다 , 동적으로 작동하게 하려고 하는데.. 왜 어디가 잘못되어서 이렇게 안되는것일까요.. 빨간색 으로 줄친 부분때문에 에러가 난다고 스튜디오에서는 알려줍니다.

  intent.putExtra("image",at_thumnail.get(res));                 <-- 이 부분입니다.

소스가 길어서 8000자 제한이 되기 떄문에.. 답변 부분에 이어서 소스를 한번 붙여보겠습니다 ㅠ

꼭좀 알고싶습니다 ㅠ ㅠ

public class HappyLife extends AppCompatActivity {
    private SectionsPagerAdapter mSectionsPagerAdapter;
    public static ArrayList<Integer> at_thumnail = new ArrayList<>();
    public static ArrayList<String> at_title = new ArrayList<>();                  public static ArrayList<String> at_ReservationPercent = new ArrayList<>();  

    private ViewPager mViewPager;
    static String  ARG_SECTION_NUMBER = "section_number";

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setTitle("화면 ");
        setContentView(R.layout.activity_happy_life);

        at_title.add("1");
        at_title.add("2");
        at_ReservationPercent.add("1번 응답");
        at_ReservationPercent.add("2번 응답");
      
        at_thumnail.add(R.drawable.a1);
        at_thumnail.add(R.drawable.a2);
        
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);
    }
          public static class PlaceholderFragment extends Fragment {
             public PlaceholderFragment() {
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            final int position = getArguments().getInt(ARG_SECTION_NUMBER);

                    View rootView = inflater.inflate(R.layout.fragment_sub2, container, false);

            TextView title = (TextView) rootView.findViewById(R.id.title);
            title.setText(at_title.get(position));

            TextView Percent = (TextView) rootView.findViewById(R.id.Reservation_Percent);
            Percent.setText(at_ReservationPercent.get(position));
Kind카인드 (3,600 포인트) 님이 2016년 10월 24일 질문
Kind카인드님이 2016년 10월 24일 수정
final ImageView thunmail = (ImageView) rootView.findViewById(R.id.thunmail);
            thunmail.setImageResource(at_thumnail.get(position));
            // 이미지에 클릭 리너스를 단다.
            thunmail.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                                      Intent intent = new Intent(getContext(),First_Movie.class);
                    
                    intent.putExtra("pos",position);

                    int res = at_thumnail.get(position);
                    intent.putExtra("image",at_thumnail.get(res));      
                   // String story = at_title.get(position);
                   // intent.putExtra("story",story);
                    startActivity(intent);
                }
            });
            return rootView;
        }
    }




public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

              @Override
        public Fragment getItem(int position) {
           

            Bundle args = new Bundle();             args.putInt(ARG_SECTION_NUMBER, position
                     PlaceholderFragment fragment = new PlaceholderFragment();
            fragment.setArguments(args);
            return fragment;
                   }

        @Override
        public int getCount() {
         return at_thumnail.size();
        }
    }
}

 




그리고 이와 이어지는 코드는 아래의 부분입니다.

package ex.real_project;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class First_Movie extends AppCompatActivity {


    public static ArrayList<Integer> at_thumnail = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first__movie5);


        at_thumnail.add(R.drawable.a1);
        at_thumnail.add(R.drawable.a2);
        at_thumnail.add(R.drawable.a3);
        at_thumnail.add(R.drawable.a4);
        at_thumnail.add(R.drawable.a5);


        Bundle bundle = getIntent().getExtras();


        int position =bundle.getInt("pos");

        ImageView image = (ImageView)findViewById(R.id.imageView);

        image.setImageResource(bundle.getInt("image"));


        TextView tw = (TextView)findViewById(R.id.textView3);

        tw.setText(bundle.getString("story"));



        /*
        int key = getIntent().getExtras().getInt("pos");

        //Toast.makeText(getBaseContext(),"First_Movie: " + key,Toast.LENGTH_SHORT).show();

        Bundle bundle = getIntent().getExtras();


        int position =bundle.getInt("pos");

        String name = bundle.getString("name");

        ArrayList<String> ary = bundle.getStringArrayList("array");
        //array 키의 값을 가져오는부분

        //int key2 = getIntent().getExtras().getInt("pos");
        //int key2 = getIntent().getExtras().getInt("pos");
        */
        // getIntent 아파트 정문
        // getExtras 105동 현관문
        // getInt 105동 출입문

    }
}
오류나는 로그도 좀 적어올려주실래요?
네 오류나는 부분을 위의 사진에 첨부하였습니다 ㅠ ㅠ
살려주세요 .. 벌써 진짜 10시간 넘게 이 에러만 잡고 있습니다.
토스트메세지로 테스트를 해보았는데.. 제가 윗부분에 써놓은
 intent.putExtra("image",at_thumnail.get(res));               이부분만 어찌하면
될것 같은데.. 여기서 도저히 진전이 안됩니다 .. ㅠ ㅠ
R.drawable.a1 ~ R.drawable.a5 까지는 전부 이미지 파일들이 저장되어 있습니다.

2개의 답변

0 추천
 
채택된 답변

IndexOutOfBound 에러가 나네요. 님께서 리소스 ID와 리스트의 인덱스를 혼돈하고 계시는 것 같아 보이네요.

 int res = at_thumnail.get(position);

위의 코드에서 리턴되는 값이 아마도 drawable의 resource id로 보입니다. 

 

 intent.putExtra("image",at_thumnail.get(res));   


Resource ID를 가지고 다시 at_thumbnail에서 값을 찾으려고 하시네요. resource ID에는 어떤 값이 들어올지 모르잖아요.

List<Drawable> thumbnails = Arrays.List(
    context.getDrwable(R.drawable.id1),
    context.getDrwable(R.drawable.id2),
    context.getDrwable(R.drawable.id3),
    context.getDrwable(R.drawable.id4),
    context.getDrwable(R.drawable.id5)
)

Drawable drawable = thumbnails.get(position);
intent.putExtra("image", drawable)

혹 위처럼 하고 싶으신 것 아닌가요?

spark (227,910 포인트) 님이 2016년 10월 24일 답변
Kind카인드님이 2016년 11월 1일 채택됨
네 맞습니다. 감사합니다.
spark 님 답변 정말 감사드립니다 ㅠ 그런데 마지막으로 궁금한점 하나만 답변해주실수 있을까요 ㅠ ㅠ ..

다름이 아니라, 한가지 궁금한점이 있어서 이렇게 글을 올렸습니다.

뷰페이지를 통해서 한장한장 넘기고 각 이미지들을 누를때 이어지는 화면에서 이미지가 넘어가는 부분은 해결되었는데 텍스트부분이 어떻게 바뀌

어야 할지 도무지 모르겠습니다..벌써 위의 화면을 만든지가 4일째 정도 되어가는데.. 발전이 없어서 도움을 청하고자 글을 올렸습니다.

위의 첫 이미지를 클릭을 하게 되면 아래의 내용이 뜹니다.

그리고 페이지뷰를 통해서 다음 이미지로 넘어가고 두번째 이미지를 클릭을 했을떄, 첫번째 아래와 똑같은 TextView가 나와서 고민입니다.

이 부분을 @string에 있는 Second_Movie_Contents로 나오게 하고 싶은데.. 이렇게 하려면, 위의 HappyLife파일에서
public static ArrayList<String> at_content = new ArrayList<>();

위의 부분과 같이 다시 만들어 주어야 하는건가요?

만약 이게 맞다면.. 아래와 같이 써주게 되어 너무 화면상에 text가 많아지게 될것 같아서 String부분에 Second_Contents를 사용해서

 바로 아래 사진의 아래와 같이 했는데 에러도 뜨고 .. 어떻게 해야할지 잘 모르겠습니다 ㅠ ㅠ ..
at_content .add("~~ 엄청나게 긴 문장 ....~~");
at_content .add("@string/First_Movie_Contents");




<TextView
    android:id="@+id/Seventh_TextView2"
    android:layout_below="@id/Seventh_TextView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/First_Movie_Contents"
    />


결론적으로 보았을때, 지금위의 소스는 각 이미지들이 클릭이 되면, 다음으로 넘어가서 클릭했던 이미지들이
다음 이미지로 잘 나오지만, 이번에는.. 각 이미지들마다 아래의 TextView의 내용구성이 달라야 하는데 이부분을
어떻게 해야할지 참 고민입니다 ㅠㅠ
기본 모델 설계부터 다시 고민을 좀 해보셔야 할 것 같아요. 각각의 페이지를 하나의 클래스로 잡아서 작업을 하시는게 여러가지로 유리해 보입니다.
public class Movie {
     Drawable drawable;
     String title;
     String description;
}

이와 같은 형태로 한페이지 안에 나오는 요소들을 클래스로 만드신 다음 그 클래스의 객체들을 리스트에 넣어서 작업하시면 훨씬 깔끔해 질 것 같습니다.
ArrayList<Movie> movieList = new ArrayList<Movie>();
0 추천
intent.putExtra("image",at_thumnail.get(res));
여기서 배열 초과 오류가 발생한 것 같습니다.
res는 리소스 id값인데 at_thumnail.get은 리스트에서 주어진 값의 index로 값을 가져오는 기능이며, 초과된 값을 호출하도록 되어있기 때문에 res를 pos로 교체하면 될 것 같습니다.
minor (13,710 포인트) 님이 2016년 10월 24일 답변
문제를 해결해서 이렇게 답변을 드립니다 ㅠ ㅠ ..
전혀 다른데서 문제를 해결했는데 아직도 그 이유는 잘 모르겠습니다..
image.setImageResource(bundle.getInt("image")); 이부분을 바꾸었음..
Intent getIntent = getIntent();
image.setImageResource(getIntent.getIntExtra("image",0));

위와 같이 하니까 해결은 되었는데.. 끙.. 아직은 잘 모르겠네요 ㅠ ㅠ
답변 정말 감사드립니다.
...