2017-01-13 4 views
0

私はアクティビティとフラグメントを処理しています。活動に は、私が(手動)このような現在のユーザーを初期化しています:親アクティビティから値を取得するとnullが返されます

User currentUser; 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     currentUser = new User("email", "name", "secondName", "age"); 
\\.....} 

MainActivityは、このようなメソッドが含まれます。今

public User getCurrentUser() { 
     return currentUser; 
    } 

を、ここでの問題は次のとおりです。で 私はこのようなmainActivityからGETCURRENTUSERを呼んでいる子フラグメント:

User u = MainActivity.newInstance().getCurrentUser(); 

MainActivity.newInstance() - このようmainActivityで定義され、retu活性のrning静的インスタンス:

private static MainActivity mainActivityInstance = new MainActivity(); 

    public static MainActivity newInstance() { 
     return mainActivityInstance; 
    } 

問題はGETCURRENTUSERがあるCurrentUserが有効データとmainActivityで初期化されていてもNULLオブジェクト参照を返すことです。 ので、例えば呼び出しにNullPointerException 私はこれをどのように解決することができ

u.getName(); 

は私にスローされますか?私は気になるように感じる ありがとう。

答えて

4

MainActivity.newInstanceでユーザーのインスタンスを作成してみますMainActivity毎回ののnewInstanceを生成しています() - このようなmainActivityで定義され、アクティビティの静的インスタンスを返します:

決して自分で直接アクティビティのインスタンスを作成してください。

問題はGETCURRENTUSERがあるCurrentUserが

これらのアクティビティインスタンスが別のJavaオブジェクトで有効なデータとmainActivityで初期化されていてもNULLオブジェクト参照を返すことです。

フラグメントから、getActivity()を呼び出して、フラグメントをホストしているアクティビティオブジェクトを取得します。これは、Androidアプリ開発の良い本やコースでカバーされています。

0

UはあなたMainActivity.newInstance()

((MainActivity)getActivity).getCurrentUser();

でユーザーを取得またはフラグメント

1

最初にオフにすることで、新しいアクティビティを作成することはできません。それはコンパイルされますが、フレームワークだけがそれを行うことができるので、適切に初期化されません。

第2に、静的変数でアクティビティを保持しません。これによりメモリがリークします。ビュー階層全体にアクティビティからの参照があるため、多くのメモリが必要です。これを行うOOMエラーが発生します。

+0

ありがとう:D –

3

多くの人が言っているように、「あなたは断片内のアクティビティをインスタンス化できません」。

2番目:フラグメントでユーザーを取得するために実装できるオプションはたくさんあります。 - 断片のパラメータとしてユーザに渡す

1:ここで一般的なオプションである。

public static FragmentChild newInstance(User user){ 
    Bundle b = new Bundle(); 
    b.putSerializable("USER_PARAM",user); 
    FragmentChild fragment = new FragmentChild(); 
    fragment.putArguments(b); 
    return fragment; 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    User user = getArguments().getSerializable("USER_PARAM") 
} 

public class User implements Serializable {} 

2 - メソッドを使用すると、((MainActivity)getActivity())GETCURRENTUSER()。それはうまくいくでしょうが、あなたが正しい方法でそれをしたいのであれば、MainActivityを直接使うのではなくインターフェースを使うべきです。

インタフェースオプション:これらのヒントのための

public class MainActivity extends AppCompatActivity implements UserDeliver { 

@Override 
public User getUser(){ 
    return user; 
} 


} 

public class MyFragment extends Fragment { 

    private UserDeliver userDeliver;  
    private User user;  

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    user = userDeliver.getUser(); 
    } 

    @Override 
    public void onAttach(Context context) { 
    super.onAttach(context); 
    userDeliver = (UserDeliver) context; 
    } 

    @Override 
    public void onDetach() { 
    super.onDetach(); 
    userDeliver = null; 
    } 

    public interface UserDeliver { 
    User getUser(); 
    } 
} 
+0

あなたは私がインターフェイスのために良い参照してサイトにリンクすることはできますか?そしてここでインターフェイスを使う方法の例かもしれません。どうもありがとう。 –

+0

@ GabiMMinimalART私はあなたにインターフェイスを使って例を与えて私の答えを編集しました。私が前に言ったように、それは良い練習の問題です。受け入れられた回答もOKです。 –

+0

ありがとう、私は感謝します! –

関連する問題