2014-05-13 2 views
0

이것은 제 3 번째 앱입니다.이 작업을 수행하기에는 너무 야심적입니다. 나에게 어떤 이름으로 listview을 표시하고 클릭하면 imageview을 변경하는 앱은 URL에서 검색합니다. 또한 슬라이드를 스크리닝하고 방금 설명한 "템플릿"을 더 많이 보여줄 수 있습니다. 여기 내가 대부분의 문제를 가진 곳입니다.null 포인터 예외, 작업 표시 줄 활동 및 단편

해결 {

내 로그 캣는 말한다 :

05-13 23:20:38.516: E/AndroidRuntime(687): java.lang.RuntimeException: 
Unable to instantiate activity ComponentInfo{com.example.test2/ 
com.example.test2.ScreenSlideActivity}: java.lang.NullPointerException 

}

이 보여주는 중지 listview 클릭에

새로운 문제 :

05-13 23:51:46.751: E/AndroidRuntime(782): java.lang.RuntimeException: An error occured while executing doInBackground() 
05-13 23:51:46.751: E/AndroidRuntime(782): at android.os.AsyncTask$3.done(AsyncTask.java:299) 

주요 활동

public class ScreenSlideActivity extends ActionBarActivity { 


SectionsPagerAdapter mSectionsPagerAdapter; 

ViewPager mViewPager; 

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

    mSectionsPagerAdapter = new SectionsPagerAdapter(
      getSupportFragmentManager()); 

    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

} 

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

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

    @Override 
    public Fragment getItem(int position) { 
     return PlaceholderFragment.newInstance(position); 
    } 

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

} 
public static class PlaceholderFragment extends Fragment { 
    private static final String ARG_SECTION_NUMBER = "section_number"; 

    public static PlaceholderFragment newInstance(int sectionNumber) { 
     PlaceholderFragment fragment = new PlaceholderFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public PlaceholderFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_screen_slide, 
       container, false); 

     String[] ponies = getResources().getStringArray(R.array.ponies); 
     String[] poniesurl=getResources().getStringArray(R.array.poniesimg); 
     final ArrayList<String> listurl = new ArrayList<String>(); 
     ListView listview = (ListView) rootView.findViewById(R.id.lista); 
     ArrayList<String> list = new ArrayList<String>(); 
     for (int i = 0; i < ponies.length; ++i) { 
       list.add(ponies[i]); 
       listurl.add(poniesurl[i]); 
      } 
     ArrayAdapter<String> arrayAdapter = 
       new ArrayAdapter<>(getActivity().getApplicationContext() 
         ,android.R.layout.simple_list_item_1,list); 
     listview.setAdapter(arrayAdapter); 
     listview.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       String selectedPonyURL=listurl.get(position); 
       new ScreenSlideActivity().new DownloadImagesTask().execute(selectedPonyURL); 
      } 

     }); 

     return rootView; 
    } 
} 
class DownloadImagesTask extends AsyncTask<String, Void, Bitmap> { 


    protected Bitmap doInBackground(String... data) { 
     String thumb = data[0]; 
     Bitmap bitmap = null; 
     try { 
      Log.d("TEST", "do in background"); 
      bitmap = BitmapFactory 
        .decodeStream((InputStream) new URL(thumb).getContent()); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return bitmap; 
    } 

    @Override 
    protected void onPostExecute(Bitmap img) { 
     Log.d("TEST", "post execute"); 
     ImageView mChart = (ImageView) findViewById(R.id.imageView1); 
     mChart.setImageBitmap(img); 
    }} 

} 

내 레이아웃

activiy_screen_slide.xml

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/pager" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.example.test2.ScreenSlideActivity" /> 

fragment_screen_slide.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
> 

<ImageView 
    android:id="@+id/imageView1" 
    android:paddingTop="10dp" 
    android:layout_width="wrap_content" 
    android:layout_height="200dip" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:src="@drawable/ic_launcher" /> 



<ListView 
    android:id="@+id/lista" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_above="@+id/button1" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/imageView1" > 

</ListView> 

</RelativeLayout> 

내 목록

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="ponies"> 
     <item>Rainbow Dash</item> 
     <item>Apple Jack</item> 
     <item>Rarity</item> 
     <item>Pinkie Pie</item> 
     <item>Twilight Sparkle</item> 
     <item>Fluttershy</item> 
    </string-array> 
    <array name="poniesimg"> 
     <item>http://fc08.deviantart.net/fs71/f/2012/087/d/e/rainbow_dash_icon_request_by_megasuperheavy-d4u76ht.png</item> 
     <item>https://www.fimfiction-static.net/images/avatars/28886_256.jpg?1336013578</item> 
     <item>http://www.fimfiction-static.net/images/avatars/139363_256.jpg?1382473406</item> 
     <item>https://lh6.googleusercontent.com/-fPQ-TEfk9RE/AAAAAAAAAAI/AAAAAAAAAD4/W_oT9Nz5MpY/photo.jpg</item> 
     <item>https://pbs.twimg.com/profile_images/431214974363385856/GAmxwTe-.png</item> 
     <item>http://files.gamebanana.com/img/ico/sprays/515cc647f37a4.png</item> 
    </array> 
</resources> 

저는 이것이 프랑켄슈타인 (Frankenstein)이라는 것을 알고 있습니다. 몇 가지 예와 제안을 정말 고맙게 생각합니다. 감사합니다

+1

나머지 logcat 출력을 추가 할 수 있습니까? – user184994

+0

'ImageView mChart = (ImageView) findViewById (R.id.imageView1);'활동/fagment의 내용을 설정하기 전에'mChart'를 초기화하지 마십시오. – Onik

+0

mChart 문제에 대한 감사 인사 :) – user3610155

답변

0

문제는에 : 당신은 당신이 새로운 ScreenSlideActivity을 만드는 볼 수 있고, AsyncTask를 대신 팽창하고있다 실행되고있는 현재,에,이 새로운 하나에 속하는으로

new ScreenSlideActivity().new DownloadImagesTask() 

레이아웃 및 'findById'가 작동하는 위치를 나타냅니다. 새 인스턴스의 인스턴스에서 생성 된 AsyncTask를를 사용하고 있기 때문에, AsyncTask.onPostExecute (내부 코드) 심하게 실패합니다

ImageView mChart = (ImageView) findViewById(R.id.imageView1); 

이유는 무엇입니까? Android에서 관리하지 않고 직접 Activity 인스턴스를 만들었 기 때문에 findViewById()를 실행할 수 없으므로 잃어 버렸습니다.

그래서 대신이 방법을 사용하여 ...이 instance..like 현재 실행중인 작업 내부의 메소드에 onItemClick 실행을 위임하려고 :

listview.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      String selectedPonyURL=listurl.get(position); 
      ((ScreenSlideActivity)getActivity()).handleOnItemClick(selectedPonyURL); 
     } 

    }); 

을하고 시작의 처리를 넣어 내부 AsyncTask를이 같은 맥락에서 ...이 같은 새 ScreenSlideActivity 객체를 생성하지 않습니다, 당신은 ScreenSlideActivity에 ... 기존 재사용됩니다

... 
    public void handleOnItemClick(String selectedPonyURL) { 
     new DownloadImagesTask().execute(selectedPonyURL); 
    } 
... 

참고 : 액티비티를 인스턴스화하지 마십시오, 그것의 창조 안드로이드가 관리한다면 , 그것은 평범한 자바 객체와 같을 것이지만 문제가 될 것이다.

+0

글을 쓸 곳과 마지막 코드를 작성하는 방법이 분실되었습니다. 새 하위 클래스를 만들어야합니까? – user3610155

+0

첫 번째 스 니펫 대신 onitemclicked를 넣습니다. –

+0

나는 내가해야 할 일을 너희에게 보이지 않는다. 붙여 넣기하면 붙여 넣기해서 붙여 넣기하면됩니다. handleOnItemClick() 메서드를 만들려고합니다. – user3610155