2016-11-08 40 views
0

我在A_Activity內部添加了三個片段。這些都是fragment_1,fragment_2,fragment_3當從異步返回時,片段不附加到活動任務

從fragment_1我打電話異步類async_class

這裏是我的Fragment_1:

public class Fragment_1 extends Fragment { 

ListView listView; 
private TrainingGetData mTrainingGetData = null; 
Context mContext; 

public Fragment_1(){ 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

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

    mTrainingGetData = new TrainingGetData(getContext()); 
    mTrainingGetData.execute((String) null); 
    return view; 
} 


public void setTitle(Context context, ArrayList<String> ids, ArrayList<String> titles, final ArrayList<String> urls){ 

    final Activity activity=(Activity) context; 
    final ArrayAdapter adapter=new ArrayAdapter(context, android.R.layout.simple_list_item_1, titles); 
    listView=(ListView) ((Activity) context).findViewById(R.id.listView_1); 
    listView.setAdapter(adapter); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Intent myIntent = new Intent(activity, AnotherActivity.class); 
      myIntent.putExtra("url", urls.get(position)); 
    startActivity(myIntent); 
     }); 
} 

} 

在異步I類做一些工作在後臺,並在後期execude我已經添加了這些代碼

public class TrainingGetData extends AsyncTask<String, String, String> { 
Fragment_1 fragment_1=new Fragment_1(); 

public TrainingGetData(Context context){ 
    mContext=context; 
} 

@Override 
protected String doInBackground(String... params) { 

    try { 
     //do the processing 
    } 
    catch (JSONException e) { 
     e.printStackTrace(); 
     return "JSON Data Parse Error"; 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
     return "Unknown Error: Insert/Update Failed"; 
    } 
    return null; 
} 

@Override 
protected void onPostExecute(String message) { 

    if(success == 0 && message.equals("No files found")){ 
     Toast.makeText(mContext, "Sorry No Data Found", Toast.LENGTH_SHORT).show(); 
    } 

    if(success==1) { 
     //do the processing 
     fragment_1.setTitle(mContext, ids, titles, urls); 
    } 
} 
} 

但是當我回到fragment_1方法的setTitle和點擊任何一個列表項它表明fragment_1不是附加到活動。

出了什麼問題? 我該如何解決這個問題?

感謝

回答

0

但是當我回到fragment_1的setTitle方法,點擊任何 列表項則說明該fragment_1未連接到活動

由於目前正在創建的新對象Fragment_1撥打setTitle方法。

傳遞TrainingGetData類中的當前片段上下文的方式與傳遞上下文相同,然後調用setTitle方法。如:

Fragment_1 fragment_1;

public TrainingGetData(Context context,Fragment_1 fragment_1){ 
    mContext=context; 
    this.fragment_1=fragment_1; 
} 

,並創建TrainingGetData對象:

mTrainingGetData = new TrainingGetData(getContext(),Fragment_1.this); 
+0

它適用於fragment_1。當我想從fragment_2和fragment_3調用TrainingGetData()時,我應該如何通過參數 – supertramp

+0

@supertramp:然後使用接口 –

+1

創建自定義事件偵聽器我已經使用方法重載完成了此操作。感謝您的幫助 – supertramp

0

因爲你Fragment Fragment_1的fragment_1對象已經被實例化您的AsyncTask TrainingGetData內你得到錯誤。這不是與您的Activity連接的Fragment對象。

爲了解決這個問題,你需要初始化fragment_1對象,如下圖所示:

fragment_1 = (Fragment) mContext; 

寫上面的代碼行ConstructorAsyncTask的TrainingGetData。

+0

是的,我再次實例化。感謝您的幫助 – supertramp

0

在創建片段的新實例時。

Fragment_1 fragment_1=new Fragment_1(); 

這些是行不通的

使用片段比如在TrainingGetData構造,並用它

public TrainingGetData(Context context, Fragment_1 fragment_1) { 
     mContext = context; 
     this.fragment_1 = fragment_1; 
    } 
+0

是的,這是問題所在。感謝您的幫助 – supertramp

+0

您可以請接受我的回答或者上去 –

+0

我不能參加,因爲我的名聲低於15 – supertramp