2016-02-09 2 views
0

У меня есть main activity и три фрагмента frag1, frag2, frag3. и я пытаюсь передать значение от frag3 до frag2. Для этого я создал интерфейс , и этот интерфейс реализован main activity, как показано ниже в коде. Проблема я столкнулся сейчас, несмотря на frag2 создан и его view is created, а также, когда значение поступает от frag3 к frag2*getView() method returns null*getView равно null даже после того, как onViewCreated был вызван

ниже выходного LogCat, чтобы показать, что был создан вид frag2

Почему getview для frag2 имеет значение null?

mainactivity:

public class MainActivity extends AppCompatActivity implements IValuePasser { 
    private final String TAG = this.getClass().getSimpleName(); 

    private Toolbar mTB = null; 
    private TabLayout mTL = null; 
    private ViewPager mVP = null; 
    private VPagerAdapter mVPAdapter = null; 

    private Frag_2 mFrag2 = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.w(TAG, "onCreate()"); 

     mFrag2 = new Frag_2(); 
    } 
    ... 
    ... 
    ... 
    @Override 
    public void onValueChanged(int value) { 
     this.mFrag2.fromFrag3(value); 
    } 
} 

frag3:

public class Frag_3 extends Fragment { 
    private final String TAG = this.getClass().getSimpleName(); 

    private View mRootView = null; 
    private TextView mtvText = null; 
    private ATIncr mATIncr = null; 

    IValuePasser mValPasser = null; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     Log.w(TAG, "onAttach()"); 

     Log.v(TAG, "getView(): " + getView()); 
     this.mValPasser = (IValuePasser) context; 

    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.w(TAG, "onCreate()"); 

     this.mATIncr = new ATIncr(); 
     Log.v(TAG, "getView(): " + getView()); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Log.w(TAG, "onCreateView()"); 

     this.mRootView = inflater.inflate(R.layout.frag_3, container, false); 
     this.mtvText = (TextView) this.mRootView.findViewById(R.id.frag3_tv); 

     Log.v(TAG, "getView(): " + getView()); 
     return mRootView; 
    } 
    ... 
    ... 
    ... 

    @Override 
    public void onResume() { 
     super.onResume(); 
     Log.w(TAG, "onResume()"); 

     this.mATIncr.execute(); 

     Log.v(TAG, "getView(): " + getView()); 
    } 

    private class ATIncr extends AsyncTask <Void, Integer, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      Log.w(TAG, "onPreExecute()"); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      Log.w(TAG, "doInBackground()"); 

      for (int i = 0; i <= 20; i++) { 
       publishProgress(i); 
       SystemClock.sleep(1000); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      Log.w(TAG, "onPostExecute()"); 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 
      Log.w(TAG, "onProgressUpdate()"); 

      mtvText.setText("" + values[0]); 
      mValPasser.onValueChanged(values[0]); 
     } 
    } 
} 

frag2:

public class Frag_2 extends Fragment { 
    private final String TAG = this.getClass().getSimpleName(); 

    private View mRootView = null; 
    private TextView mtvText = null; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Log.w(TAG, "onCreateView()"); 

     this.mRootView = inflater.inflate(R.layout.frag_2, container, false); 
     this.mtvText = (TextView) this.mRootView.findViewById(R.id.frag2_tv); 

     Log.v(TAG, "getView(): " + getView()); 
     return mRootView; 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     Log.w(TAG, "onViewCreated()"); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Log.w(TAG, "onActivityCreated()"); 
    } 
    ... 
    ... 
    ... 
    public void fromFrag3(int value) { 
     if (getView() != null) { 
      this.mtvText.setText("" + value); 
     } else { 
      Log.d(TAG, "getViwe(): " + getView()); 
     } 
    } 
} 

LogCat

02-09 10:08:25.050 25092-25092/? W/Frag_1: onAttach() 
02-09 10:08:25.050 25092-25092/? W/Frag_1: onCreate() 
02-09 10:08:25.050 25092-25092/? W/Frag_1: onCreateView() 
02-09 10:08:25.060 25092-25092/? W/Frag_1: onViewCreated() 
02-09 10:08:25.060 25092-25092/? W/Frag_1: onActivityCreated() 
02-09 10:08:25.060 25092-25092/? W/Frag_1: onStart() 
02-09 10:08:25.060 25092-25092/? W/Frag_1: onResume() 
02-09 10:08:25.060 25092-25092/? W/Frag_2: onAttach() 
02-09 10:08:25.060 25092-25092/? W/Frag_2: onCreate() 
02-09 10:08:25.060 25092-25092/? W/Frag_2: onCreateView() 
02-09 10:08:25.060 25092-25092/? V/Frag_2: getView(): null 
02-09 10:08:25.060 25092-25092/? W/Frag_2: onViewCreated() 
02-09 10:08:25.060 25092-25092/? W/Frag_2: onActivityCreated() 
02-09 10:08:25.060 25092-25092/? W/Frag_3: onAttach() 
02-09 10:08:25.060 25092-25092/? V/Frag_3: getView(): null 
02-09 10:08:25.060 25092-25092/? W/Frag_3: onCreate() 
02-09 10:08:25.060 25092-25092/? V/Frag_3: getView(): null 
02-09 10:08:25.060 25092-25092/? W/Frag_3: onCreateView() 
02-09 10:08:25.060 25092-25092/? V/Frag_3: getView(): null 
02-09 10:08:25.060 25092-25092/? W/Frag_3: onViewCreated() 
02-09 10:08:25.060 25092-25092/? V/Frag_3: getView(): android.widget.RelativeLayout{18d55403 V.E..... ......I. 0,0-0,0} 
02-09 10:08:25.060 25092-25092/? W/Frag_3: onActivityCreated() 
02-09 10:08:25.060 25092-25092/? V/Frag_3: getView(): android.widget.RelativeLayout{18d55403 V.E..... ......I. 0,0-0,0} 
02-09 10:08:25.060 25092-25092/? W/Frag_2: onStart() 
02-09 10:08:25.060 25092-25092/? W/Frag_2: onResume() 
02-09 10:08:25.060 25092-25092/? W/Frag_3: onStart() 
02-09 10:08:25.060 25092-25092/? V/Frag_3: getView(): android.widget.RelativeLayout{18d55403 V.E..... ......I. 0,0-0,0} 
02-09 10:08:25.060 25092-25092/? W/Frag_3: onResume() 
02-09 10:08:25.060 25092-25092/? W/Frag_3: onPreExecute() 
02-09 10:08:25.060 25092-25092/? V/Frag_3: getView(): android.widget.RelativeLayout{18d55403 V.E..... ......I. 0,0-0,0} 
02-09 10:08:25.070 25092-25111/? W/Frag_3: doInBackground() 

LogCat когда frag3 переходит к frag2:

02-09 10:08:29.080 25092-25092/? W/Frag_3: onProgressUpdate() 
02-09 10:08:29.080 25092-25092/? D/Frag_2: getViwe(): null 
02-09 10:08:30.080 25092-25092/? W/Frag_3: onProgressUpdate() 
02-09 10:08:30.080 25092-25092/? D/Frag_2: getViwe(): null 
02-09 10:08:30.140 308-308/? E/SMD: DCD ON 
02-09 10:08:31.090 25092-25092/? W/Frag_3: onProgressUpdate() 
02-09 10:08:31.090 25092-25092/? D/Frag_2: getViwe(): null 
02-09 10:08:32.090 25092-25092/? W/Frag_3: onProgressUpdate() 
02-09 10:08:32.090 25092-25092/? D/Frag_2: getViwe(): null 
02-09 10:08:32.920 795-4291/? D/SSRM:n: SIOP:: AP = 340, PST = 345, CUR = 450 
02-09 10:08:33.080 25092-25092/? W/Frag_3: onProgressUpdate() 
02-09 10:08:33.080 25092-25092/? D/Frag_2: getViwe(): null 
+1

'getView()' возвращает 'null', потому что представление не создается в' onCreateView() ', вместо этого используйте' mRootView'. –

+1

вопрос о том, почему getView возвращает null даже после того, как onViewCreated не используется или не работает mRootView – Selvin

+0

@ user2121 ... пожалуйста, зайдите в onDestroyView/onStop/onPause тоже ... все ли фрагменты видимы одновременно? – Selvin

ответ

0

Вы можете установить его недействительным в главном private Frag_2 mFrag2 = null; и вызвать его из this.mFrag2.fromFrag3(value);. Также mFrag2 не инициализируется в onCreate() Теперь его значение null, и вы пытаетесь дать значение fromFrag3(value). Посмотрим на fromFrag3. Он проверяет, имеет ли его представление значение null. Вы присылаете нулевой вид и передает SetText в этом, если заявление:

if (getView() != null) { 
    this.mtvText.setText("" + value); 
} else { 
    Log.d(TAG, "getViwe(): " + getView()); 
} 

Вы должны удалить нулевое значение из mFrag2.

+0

Я редактировал мой вопрос, actoil mFrag2 был инициализирован в onСоздание основной деятельности, но я еще не отправил – user2121

+0

Вы пытались удалить «= null»? Я имею в виду, что вы установили его нулевым, вы не меняете его из-за инструкции (getView()! = Null). Он никогда не вводит «this.mtvText.setText (« + значение »); – kagkar

Смежные вопросы