2013-10-15 40 views
-1

我有一個Selectl主機活動類窗體,其中我實例化我的AddHttpLinksFragment。之後,我稱之爲片段的getPls()方法。一切正常,只要我不調用片段的getPls()方法中的任何View元素(小部件,適配器)。看起來,當我調用這個方法時,Fragment的視圖還沒有創建,所以它的小部件是Null。我怎樣才能防止這一點?片段的視圖元素爲空

Selectl.class:

 fragmentManager = getFragmentManager(); 
     fragmentTransaction = fragmentManager.beginTransaction(); 
     AddHttpLinksFragment fragment2 = new AddHttpLinksFragment(); 
     fragmentTransaction.add(R.id.fragment_container1, fragment2, "addlinksF"); 
     fragmentTransaction.commit(); 
     fragmentManager.executePendingTransactions(); 

     AddHttpLinksFragment fragment = (AddHttpLinksFragment) getFragmentManager().findFragmentByTag("addlinksF"); 
     fragment.getPls(path); 

AddHttpLinksFragmen.class:

public class AddHttpLinksFragment extends android.app.Fragment implements View.OnClickListener { 

EditText httpAddressEdit; 
EditText linkText; 
URI uriPls; 
ListView lv; 
ArrayList<String> strList = new ArrayList<String>(); 
ArrayAdapter<String> arrayAdapter; 
int itemPosition; 
DBHttpLinks db; 


public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    setRetainInstance(true); 
    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.addhttplinksfragment, container, false); 

    // ListView init 
    lv = (ListView) v.findViewById(R.id.listView); 

    arrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, strList); 
    lv.setAdapter(arrayAdapter); 

    return v; 

} 

// ... 

public void getPls(Uri path) { 

    try { 
     uriPls = new URI(path.toString()); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 

    PlsReader mPlsReader = new PlsReader(uriPls); 
    strList.addAll(mPlsReader.Read()); 

    arrayAdapter.notifyDataSetChanged();  // <--- ANR, line 233 
    TextView tv = (TextView) getActivity().findViewById(R.id.textView_long_press); // <--- ANR 
    tv.setText(getString(R.string.long_press_to)); // <---ANR 
} 

// ... 

} 

的logcat:

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.Selectl}: java.lang.NullPointerException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358) 
     at android.app.ActivityThread.access$600(ActivityThread.java:153) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:5227) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
     at com.krisk.astream.AddHttpLinksFragment.getPls(AddHttpLinksFragment.java:233) 
+0

哪一行是'AddHttpLinksFragment.java:233' –

+0

據評論'arrayAdapter.notifyDataSetChanged(); // <--- ANR,第233行' – Kristopher

+0

嘗試在'onResume'中調用它。看看處理片段生命週期http://developer.android.com/guide/components/fragments.html – Raghunandan

回答

1

如果片段不具有視圖中顯示onCreateView不叫。所以arrayadapter爲null,並且該行沒有被稱爲:

arrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, strList); 

UPDATE:

將這個您onCreateView

TextView tv = (TextView) getActivity().findViewById(R.id.textView_long_press); 
tv.setText(getString(R.string.long_press_to)); 

改變你的方法是這樣的:

public void getPls(Uri path) { 

    try { 
     uriPls = new URI(path.toString()); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 

    PlsReader mPlsReader = new PlsReader(uriPls); 
    strList.addAll(mPlsReader.Read()); 


} 

創建一個onResume

@Override 
public void onResume() { 
    super.onResume(); // Always call the superclass method first 

    if (strList != null) {  

     arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, strList); 
     lv.setAdapter(arrayAdapter); 
    } 
} 
+0

'''selectl.class'中調用'fragment.getPls(path)' – Raghunandan

+0

@Raghunandan是的,它必須從那裏調用。 – Kristopher

+2

在您的活動類的'onResume'中執行,並嘗試將textview的初始化轉換爲'onCreateView'。將textview聲明爲類成員。像'電視=(TextView)view.findViewById(R.id.textView_long_press)' – Raghunandan

1

從你的意見,你說你在你的片段XML有TextView的

所以,你需要與膨脹的視圖對象onCreateView

TextView tv ; 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    setRetainInstance(true); 
    View v = inflater.inflate(R.layout.addhttplinksfragment, container, false); 
    lv = (ListView) v.findViewById(R.id.listView); 
    tv = (TextView) view.findViewById(R.id.textView_long_press); 
    arrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, strList); 
    lv.setAdapter(arrayAdapter); 
    return v; 

} 

呼叫getPls(path)onResume初始化的TextView。

Resumed 

The fragment is visible in the running activity. 

http://developer.android.com/guide/components/fragments.html