2017-08-25 7 views
0

//が動作していない、ここで私は、ユーザー名からのEditText値を取得しています私はmainactivityからフラグメント中のTextViewの値を取得しようとしたとき、私のアプリは、これはMainactivityのJavaクラスです

public class Home_Foodcourt extends AppCompatActivity implements View.OnClickListener { 
    EditText username,userpassword; 
    Button user_login; 
    TextView user_register; 
    FoodCourt_UserLoginDatabase foodCourt_userDatabase; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home__foodcourt); 
     foodCourt_userDatabase=new FoodCourt_UserLoginDatabase(this); 

     username=(EditText)findViewById(R.id.username); 
     userpassword= (EditText) findViewById(R.id.loginpassword); 
     user_login=(Button)findViewById(R.id.login_submit); 
     user_register= (TextView) findViewById(R.id.user_newregister); 
     user_register.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent i=new Intent(Home_Foodcourt.this,FoodCourt_Register.class); 
       startActivity(i); 
      } 
     }); 

     user_login.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View view) { 

     String name=username.getText().toString(); 
     String password=userpassword.getText().toString(); 
     String Admin="aDminSN"; 
     String Pass= foodCourt_userDatabase.Login(name); 

     if(password.equals(Pass)) // 
     { 
       Message.message(this,"Log in Successfully"); 
      Intent i=new Intent(Home_Foodcourt.this,Userhome.class); 
      i.putExtra("Username",name); 
      startActivity(i); 

      }else 
      { 
       Message.message(this,"Login Failed"); 
      } 

    } 

//これはさホームフレグメントは私がMainactivityからその文字列を取得したいが、私のアプリはクラッシュする。それが適切に

+0

あなたはlogcatをクラッシュから投稿できますか? –

+0

どこがクラッシュし、どの例外が起きますか?スタックトレースを送信します。 – Piwo

+0

原因:java.lang.NullPointerException:NULLオブジェクト参照で仮想メソッド 'void android.widget.TextView.setText(java.lang.CharSequence)'を呼び出そうとしました – satish

答えて

0

名前や電子メールなどの文字列を渡すには、カスタムsharedPreferencesクラスを使用するのが簡単です。文字列をフラグメントAからアクティビティBに渡し、またフラグメントBとCの名前にアクセスする場合は、すべてローカルのsharedPreferencesクラスを使用して行うことができます。私はあなたのための例のコードを下記に投稿します。

カスタムSharedPreferencesクラス(それがUserDetailsか何かを呼び出す):

public class UserDetails{ 
static final String SharedPrefUserName = ""; //default value can go in between " ". 
static final String SharedPrefUserOtherData = ""; 

//the bit below gets the shared preferences 
public static SharedPreferences getSharedPreferences(Context ctx) 
{ 
    return PreferenceManager.getDefaultSharedPreferences(ctx); 
} 

//This sets a string value 
public static void setLoggedInUserName(Context ctx, String name) 
{ 
    SharedPreferences.Editor editor = getSharedPreferences(ctx).edit(); 
    editor.putString(SharedPrefUserName, name); 
    editor.commit(); 
} 

//this retrieves a string value 
public static String getLoggedInUserName(Context ctx) 
{ 
    return getSharedPreferences(ctx).getString(SharedPrefUserName, ""); 
} 


} 

資格情報を設定するには、あなたが使用します。

username = (EditText) findViewById(R.id.username); 

String name = username.getText().toString(); 

// If you called your shared prefs 'UserDetails', storing the name would look like this: 

UserDetails.setLoggedInUserName(getApplicationContext(), name); 

その後、格納されたデータを取得するため、及び(TextViewの設定それを 'userNameTextView'と呼ぶことができます)。

Textview usernameTextView = (TextView) findViewById(R.id.yourTextViewId); 

String userStoredName = UserDetails.getLoggedInUserName(getActivity()); 

userNameTextView.setText(userStoredName); 

編集:これを行うことができますSharedPreferencesの新しいクラスを作成せずに以下のコードはあなたのものと同じですが、SharedPreferencesを実装して修正しました。

Stringを使用して、共有のprefsに文字列を挿入します。

SharedPreferences preferences = 
PreferenceManager.getDefaultSharedPreferences(this); 
SharedPreferences.Editor editor = preferences.edit(); 
editor.putString("Name",name); 
editor.apply(); 

これは、(getText()。toString()を使用して)E​​ditTextで取得した 'name'の値を設定します。今すぐあなたのフラグメントから「名前を」にアクセスするために、あなたがこれを行うことができます:単にコードの最初のビットと同様に、ここで使用されているか、「名前」

SharedPreferences preferences = 
PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
String name = preferences.getString("Name", ""); 

注、これは一部である、「キー」と呼ばれています「キーと値のペア」の環境設定に格納されている文字列にアクセスするには、キーが必要です。この方法で、任意の数のKey-Valueペア(名前、年齢、メール、DoB、国など)を保存し、アプリ内のどこにでもアクセスできます。パスワードを共有設定に保存しないように注意してください。

これを理解しやすくするために、投稿したコードを書き換えてコメントを付けて強調表示します。

あなたの主な活動(最初の1):フラグメントのための今

public class Home_Foodcourt extends AppCompatActivity implements View.OnClickListener { 
EditText username,userpassword; 
Button user_login; 
TextView user_register; 
FoodCourt_UserLoginDatabase foodCourt_userDatabase; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home__foodcourt); 
    foodCourt_userDatabase=new FoodCourt_UserLoginDatabase(this); 

    username=(EditText)findViewById(R.id.username); 
    userpassword= (EditText) findViewById(R.id.loginpassword); 
    user_login=(Button)findViewById(R.id.login_submit); 
    user_register= (TextView) findViewById(R.id.user_newregister); 

    user_register.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent i=new Intent(Home_Foodcourt.this,FoodCourt_Register.class); 
      startActivity(i); 
     } 
    }); 

    user_login.setOnClickListener(this); 

} 

@Override 
public void onClick(View view) { 

    String name=username.getText().toString(); 

    //############ I've added the section below. ########### 
    SharedPreferences preferences = 
    PreferenceManager.getDefaultSharedPreferences(this); 
    SharedPreferences.Editor editor = preferences.edit(); 
    editor.putString("Name",name); 
    editor.apply(); 
    //############ SharedPref section complete. ############ 

    String password=userpassword.getText().toString(); 
    String Admin="aDminSN"; 
    String Pass= foodCourt_userDatabase.Login(name); 

    if(password.equals(Pass)) // 
    { 
      Message.message(this,"Log in Successfully"); 
     Intent i=new Intent(Home_Foodcourt.this,Userhome.class); 
     i.putExtra("Username",name); 
     startActivity(i); 

     }else 
     { 
      Message.message(this,"Login Failed"); 
     } 

} 

public class HomeFragment extends Fragment { 
private TextView textView; 

    public HomeFragment() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     Bundle bundle=getArguments(); 
     View rootView=inflater.inflate(R.layout.fragment_home,container,false); 

     // ####### ALWAYS initialise your view components like below ## 
     TextView welcomeMessage = (TextView) findViewById(R.id.PUT_TEXTVIEW_ID_HERE); 

     // ###### The section below fetches the 'name' value from the first activity ### 
     SharedPreferences preferences = 
    PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

     String username = preferences.getString("Name", "DEFAULT_STRING"); 
     /*You can change DEFAULT_STRING to be any string you want. If there 
     isn't any data to pull from SharedPrefs, it will show this string instead!*/ 
     // ################### 


     textView.welcomeMessage("Welcome to FoodCourt " + username); 
     return rootView; 
    } 

} 

は、私はこれをテストしていないとブラウザだけでそれを書かれているが、それは非常にです私の現在のプロジェクトで使用しているのと同じように、私はそれがあなたのために働くと確信しています。それがうまくいかない場合はコメントしてください。エラーコードを提供して、私に何かを働かせてください。

+0

上記のslipped_diskは、フラグメント内でTextViewを初期化しませんでした。アクセスできるようにするには、クラス内でこれを行う必要があります。私が投稿したコードの3番目のセグメントの最初の行は、TextView(またはMainActivityのEditTextとButtonで行ったのと同じように)を初期化する方法を示しています。 – JSteward

+0

こんにちはスチュワート、本当にありがとうございますが、私はsqliteデータベースを使用してそれを取得したい...私のコードで提案してください....それはmwに役立つでしょう – satish

+0

あなたは参照データのいくつかの並べ替えを格納する必要がありますあなたのアプリケーションでは、関連するデータをデータベースから取り出すことができます。私はあなたのデータベースのユーザーの電子メールを検索する場合は、SELECT FROMクエリを使用してテーブルを参照するには、アプリケーションに格納されている名前やuser_idのようなものが必要です。それは理にかなっていますか? – JSteward

0

あなたはクラスUserhome.classを開始する意図を設定しているあなたは、私が問題を取得しています場所を確認してくださいと値を取得するためにhelpmeしてくださいすることができ、その主な活動から

public class HomeFragment extends Fragment { 
    private TextView textView; 

     public HomeFragment() { 
      // Required empty public constructor 
     } 


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      // Inflate the layout for this fragment 
      Bundle bundle=getArguments(); 
      View rootView=inflater.inflate(R.layout.fragment_home,container,false); 
      textView.setText("Welcome to FoodCourt"+"username"); 
      return rootView; 
     } 

    } 

を値を取得されていません、これは存在しますか?あなたは()メソッドは、文字列にこれを行うには、あなたがバンドルから必要とされている「ユーザ名」ではないユーザ名を、それを設定しているあなたが使用することができますtextView.setTextにテキストを設定している

bundle.getString(“Username“) 
+0

それは動作していないと私は同じエラーが発生している – satish

+0

私はUserhome.javaでフラグメントクラスの使用法のロジックを使用して...と私は、フラグメントのテキストの意図を使用しているエラーをスローされている可能性があります。 – satish

+0

setText()メソッドを使用する前にtextViewを初期化していません。 user_register =(TextViewの): –

関連する問題