2017-04-21 30 views
2

我在這裏是新的。我是法國人,所以也許我的英語不太好,對不起。SharedPreferences保存按鈕變化後,點擊它不可見,讓出現另一個按鈕

我是Android開發的初學者,爲了完成我的學習,我創建了一個應用程序。

我有一個叫做VoeuxActivity.java的活動編號爲1的8個按鈕(和8個TextViews),它們在開始時都是VISIBLE,當用戶點擊其中一個按鈕時,INVISIBLE改變了(用戶看不到按鈕後,點擊它),當我退出應用程序,我再次回到我的應用程序,該按鈕總是隱身的感謝SharedPreferences和這個論壇的成員。但是現在當我點擊名爲「totoB」的按鈕時,它將不可見,而另一個按鈕在名爲PersoActivity.java的另一個活動編號2上變爲可見,因爲第一個活動用於解鎖一些鎖定的字符,當我選擇一個新字符活動1,它將在活動1中不可見,並且將在活動2中可見,以便爲戰鬥選擇2個字符(這就是爲什麼存在布爾名稱「isClicked」),但我嘗試使用SharedPreferences保持按鈕上的按鈕可見第二個活動,但它根本不工作。 如果我退出應用程序並在應用程序中再次返回時解鎖新角色,則新角色解鎖不會保存爲可見狀態,而且他將再次隱藏,但我希望始終可以通過SharedPreferences看到他。我在第一次活動中使用相同的按鈕發佈法庭代碼,然後在第二次活動中發佈法庭代碼(我嘗試與第一次活動做同樣的事情,但我的解決方案無法工作),也許你可以幫我解決我的問題。

的第一個活動的代碼可以工作,並節省changements:

public class VoeuxActivity extends Activity { 
Button totoB; 
TextView totoTv; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_voeux); 

    final SharedPreferences prefs = getSharedPreferences("sharedPreferences", Context.MODE_PRIVATE); 

    totoB = (Button) findViewById(R.id.perso1); 
    totoTv = (TextView) findViewById(R.id.perso1Text); 
    totoB.setVisibility(prefs.getBoolean("isTotoBVisible", true) ? View.VISIBLE : View.INVISIBLE); 
    totoTv.setVisibility(prefs.getBoolean("isTotoTVVisible", true) ? View.VISIBLE : View.INVISIBLE); 

    totoB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      prefs.edit().putBoolean("isTotoBVisible", false).apply(); 
      prefs.edit().putBoolean("isTotoTVVisible", false).apply(); 

      totoB.setVisibility(View.INVISIBLE); 
      totoTv.setVisibility(View.INVISIBLE); 
      Intent intentToto = new Intent(VoeuxActivity.this, JouerActivity.class); 
      startActivity(intentToto); 
     } 
    }); 
} 

我嘗試做同樣的事情第二個活動,但它不能正常工作這時候,changement不會保存。

公共類PersoActivity延伸活動{

public static Personnage p1, p2; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_perso); 

    final SharedPreferences prefs = getSharedPreferences("sharedPreferences", Context.MODE_PRIVATE); 

    final Button totoPersoBtn = (Button) findViewById(R.id.perso1); 
    final TextView totoPersoTv = (TextView) findViewById(R.id.perso1Text); 
    totoAdversaireBtn = (Button) findViewById(R.id.adversaire1); 
    totoAdversaireTv = (TextView) findViewById(R.id.adversaire1Text); 
    totoPersoBtn.setVisibility(prefs.getBoolean("isTotoPersoBtnInvisible", true) ? View.INVISIBLE : View.VISIBLE); 
    totoPersoTv.setVisibility(prefs.getBoolean("isTotoPersoTvInvisible", true) ? View.INVISIBLE : View.VISIBLE); 

totoAdversaireBtn.setVisibility(prefs.getBoolean( 「isTotoAdversaireBtnInvisible」,真)View.INVISIBLE:View.VISIBLE);

totoAdversaireTv.setVisibility(prefs.getBoolean(「isTotoAdversaireTvInvisible」,true)?View.INVISIBLE:View.VISIBLE);

if(VoeuxActivity.isClicked) { 
     prefs.edit().putBoolean("isTotoPersoBtnInvisible", false).apply(); 
     prefs.edit().putBoolean("isTotoPersoTvInvisible", false).apply(); 
     prefs.edit().putBoolean("isTotoAdversaireBtnInvisible", false).apply(); 
     prefs.edit().putBoolean("isTotoAdversaireTvInvisible", false).apply(); 
     totoPersoTv.setVisibility(View.VISIBLE); 
     totoPersoBtn.setVisibility(View.VISIBLE); 
     totoAdversaireBtn.setVisibility(View.VISIBLE); 
     totoAdversaireTv.setVisibility(View.VISIBLE); 
    } else { 
     totoPersoBtn.setVisibility(View.INVISIBLE); 
     totoPersoTv.setVisibility(View.INVISIBLE); 
     totoAdversaireBtn.setVisibility(View.INVISIBLE); 
     totoAdversaireTv.setVisibility(View.INVISIBLE); 
    }}} 

如何在第二個活動中將Button和TextView的可視變更保存爲不可見? 非常感謝你,如果有人能幫助我,因爲我真的不知道爲什麼它不工作。 Giggs

+0

您是否嘗試過用承諾,而不是適用?由於提交將直接將更改添加到存儲,而不是通過內存中。 – uncannyj

+0

真的嗎?我不知道嗎?我不知道什麼是提交?你的意思是什麼?你可以寫一個例子嗎? –

+0

我嘗試用「commit()」替換「apply()」,但它不能工作,沒有保存 –

回答

1

我做了一個示例應用程序並進行了測試。它保存文本瀏覽的最後狀態(可見或不可見),無論您進行哪些活動更改。即使您退出並回到應用程序,它也會加載最後一個狀態。

清單文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.key.hs.invisiblebuttons"> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <activity android:name=".Activity1" 
      android:label="Test1" 
      android:alwaysRetainTaskState="true" 
      android:configChanges="keyboardHidden|orientation|screenSize" 
      > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"></action> 
      <category android:name="android.intent.category.HOME"></category> 
      <category android:name="android.intent.category.LAUNCHER"></category> 

     </intent-filter> 
     </activity> 

     <activity 
      android:name=".Activity2" 
      android:configChanges="keyboardHidden|orientation|screenSize" 
      android:hardwareAccelerated="true"> 
     </activity> 
    </application> 
</manifest> 

Activity1.class

package com.key.hs.invisiblebuttons; 

    import android.content.Intent; 
    import android.content.SharedPreferences; 
    import android.os.Bundle; 
    import android.support.v7.app.AppCompatActivity; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.TextView; 

    /** 
    * Created by Hasan on 26.04.2017. 
    */ 

    public class Activity1 extends AppCompatActivity { 

     private boolean btn1visiblity, btn2visibility; 
     private TextView tv1, tv2; 
     private Button btn1, btn2, act2, reset; 


     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity1lay); 

      tv1= (TextView)findViewById(R.id.tv1); 
      tv2=(TextView)findViewById(R.id.tv2); 
      btn1= (Button)findViewById(R.id.btn1); 
      btn2=(Button)findViewById(R.id.btn2); 
      act2=(Button)findViewById(R.id.act2); 
      reset=(Button)findViewById(R.id.reset); 


      //Create or load preferences 
      final SharedPreferences prefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE); 
      btn1visiblity = prefs.getBoolean("TV1visibility", true); 
      btn2visibility = prefs.getBoolean("TV2visibility", true); 

      //take into effect saved booleans 
      if(btn1visiblity){ 
       tv1.setVisibility(View.VISIBLE); 
      }else{ 
       tv1.setVisibility(View.INVISIBLE); 
      } 
      if(btn2visibility){ 
       tv2.setVisibility(View.VISIBLE); 
      }else{ 
       tv2.setVisibility(View.INVISIBLE); 
      } 


      reset.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        final SharedPreferences prefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE); 
        btn1visiblity = prefs.getBoolean("TV1visibility", true); 
        btn2visibility = prefs.getBoolean("TV2visibility", true); 

        SharedPreferences.Editor editor = prefs.edit(); 
        editor.putBoolean("TV1visibility", true); 
        editor.putBoolean("TV2visibility", true); 
        editor.commit(); 

        tv1.setVisibility(View.VISIBLE); 
        tv2.setVisibility(View.VISIBLE); 

       } 
      }); 

      act2.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent intent = new Intent(Activity1.this, Activity2.class); 
        startActivity(intent); 
        finish(); 

       } 
      }); 

      btn1.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //Create or load preferences 
        final SharedPreferences prefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE); 
        btn1visiblity = prefs.getBoolean("TV1visibility", true); 

        //save new boolean 
        SharedPreferences.Editor editor = prefs.edit(); 
        editor.putBoolean("TV1visibility", false); 
        editor.commit(); 
        tv1.setVisibility(View.INVISIBLE); 
       } 
      }); 

      btn2.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //Create or load preferences 
        final SharedPreferences prefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE); 
        btn2visibility = prefs.getBoolean("TV2visibility", true); 

        //save new boolean 
        SharedPreferences.Editor editor = prefs.edit(); 
        editor.putBoolean("TV2visibility", false); 
        editor.commit(); 
        tv2.setVisibility(View.INVISIBLE); 
       } 
      }); 

    } 
    } 

Activity2.class

 package com.key.hs.invisiblebuttons; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

/** 
* Created by Hasan on 26.04.2017. 
*/ 

public class Activity2 extends AppCompatActivity { 

    private boolean btn1visiblity, btn2visibility; 
    private TextView tv1, tv2; 
    private Button btn1, btn2, act1, reset; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity2lay); 

     tv1= (TextView)findViewById(R.id.tv1); 
     tv2=(TextView)findViewById(R.id.tv2); 
     btn1= (Button)findViewById(R.id.btn1); 
     btn2=(Button)findViewById(R.id.btn2); 
     act1=(Button)findViewById(R.id.act1); 
     reset=(Button)findViewById(R.id.reset); 

     //Create or load preferences 
     final SharedPreferences prefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE); 
     btn1visiblity = prefs.getBoolean("TV1visibility", true); 
     btn2visibility = prefs.getBoolean("TV2visibility", true); 

     //if tvs invisible in activity1 make them visible in activity2 
     if(!btn1visiblity){ 
      tv1.setVisibility(View.VISIBLE); 
     }else{ 
      tv1.setVisibility(View.INVISIBLE); 
     } 
     if(!btn2visibility){ 
      tv2.setVisibility(View.VISIBLE); 
     }else{ 
      tv2.setVisibility(View.INVISIBLE); 
     } 

     //resets booleans 
     reset.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       final SharedPreferences prefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE); 
       btn1visiblity = prefs.getBoolean("TV1visibility", true); 
       btn2visibility = prefs.getBoolean("TV2visibility", true); 

       SharedPreferences.Editor editor = prefs.edit(); 
       editor.putBoolean("TV1visibility", true); 
       editor.putBoolean("TV2visibility", true); 
       editor.commit(); 
       tv1.setVisibility(View.INVISIBLE); 
       tv2.setVisibility(View.INVISIBLE); 

      } 
     }); 


     //go to activity1 
     act1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(Activity2.this, Activity1.class); 
       startActivity(intent); 
       finish(); 

      } 
     }); 

     //makes tv1 invible 
     btn1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Create or load preferences 
       final SharedPreferences prefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE); 
       btn1visiblity = prefs.getBoolean("TV1visibility", true); 

       //save new boolean 
       SharedPreferences.Editor editor = prefs.edit(); 
       editor.putBoolean("TV1visibility", true); 
       editor.commit(); 
       tv1.setVisibility(View.INVISIBLE); 
      } 
     }); 

     //makes tv2 invisible 
     btn2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Create or load preferences 
       final SharedPreferences prefs = getSharedPreferences("sharedPreferences", MODE_PRIVATE); 
       btn2visibility = prefs.getBoolean("TV2visibility", true); 

       //save new boolean 
       SharedPreferences.Editor editor = prefs.edit(); 
       editor.putBoolean("TV2visibility", true); 
       editor.commit(); 
       tv2.setVisibility(View.INVISIBLE); 
      } 
     }); 



    } 
} 

activity1lay。XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/tv1" 
     android:text="example tv1" 
     android:layout_alignParentStart="true"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/tv2" 
     android:text="example tv2" 
     android:layout_alignParentEnd="true"/> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/btn2" 
     android:text="TV2 invisible" 
     android:layout_alignParentBottom="true"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/btn1" 
     android:text="TV1 invisible" 
     android:layout_above="@id/btn2"/> 


    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/act2" 
     android:text="ACTIVITY2" 
     android:layout_alignParentEnd="true" 
     android:layout_centerInParent="true"></Button> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/reset" 
     android:text="RESET VISIBILITY" 
     android:layout_alignParentStart="true" 
     android:layout_centerInParent="true"/> 

</RelativeLayout> 

activity2lay.xml

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/tv1" 
      android:text="example tv1" 
      android:layout_centerInParent="true"/> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/tv2" 
      android:text="example tv2" 
      android:layout_above="@id/tv1" 
      android:layout_centerHorizontal="true"/> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/btn1" 
      android:text="TV1 invisible" 
      android:layout_above="@id/btn2"/> 
     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/btn2" 
      android:text="TV2 invisible" 
      android:layout_alignParentBottom="true"/> 
     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/act1" 
      android:text="ACTIVITY1" 
      android:layout_alignParentEnd="true" 
      android:layout_centerInParent="true"></Button> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/reset" 
      android:text="RESET VISIBILITY" 
      android:layout_alignParentStart="true" 
      android:layout_centerInParent="true"/> 
    </RelativeLayout> 
+0

嗨哈桑,謝謝你的回答。也許我的英語不好,所以我不太瞭解,你能解釋我的更多解釋嗎?你可以發表一個小例子的代碼嗎?我在每個按鈕上都有一個onClickListener來創建一個新的personnage,然後解鎖某個按鈕的點擊,但是這裏沒有提到SharedPreferences,因爲我希望按鈕在點擊之前始終可見。事實上,在遊戲開始時,第二個活動的按鈕都是不可見的(只是默認的按鈕沒有)。 –

+0

//布爾值private boolean visibility1,visibility2; //定義一個sharedpreferences final SharedPreferences prefs = getSharedPreferences(「sharedPreferences」,MODE_PRIVATE); visibility1 = prefs.getBoolean(「visibility1」,true); visibility2 = prefs.getBoolean(「visibility2」,true); totoB.setOnClickListener(new View.OnClickListener(){@Override public void onClick(View v){SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean(「visibility1」,false); editor.commit();} }); –

+0

//第二個活動//布爾值private boolean visibility1,visibility2;最後的SharedPreferences prefs = getSharedPreferences(「sharedPreferences」,Context.MODE_PRIVATE); visibility1 = prefs.getBoolean(「visibility1」,true); visibility2 = prefs.getBoolean(「visiblity2」,true); if(visibility1 = true){x..setVisibility(View.VISIBLE);} else {x.setVisibility(View.IN VISIBLE);} 我希望它有幫助。我會使用像這樣的sharedprefrences來保存和獲取數據。 –

相關問題