take_rock_5
@take_rock_5 (イ タケ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

WebViewのReloadを一定の間隔更新させ更新間隔をPreferenceを用いて可変させたい

解決したいこと

WebViewでReloadを一定の間隔で周期的に実行し、
Reload間隔をPreferenceを用いて可変させたいのですが、
「Preferenceを用いて可変させる」ところがうまくできません。
おそらく、数値(更新時間)をbtn_set.setOnClickListenerで設定する際、
数値の設定と保存がうまくできていないもとの思います。

どの様に修正したらよいかをご教示頂けると非常に助かります。

発生している問題・エラー

WebViewのReloadを一定の間隔で更新というのは基本的にはできております。
ですが、数値を変更した際、設定した数値が反映されず
実行させると、Reload間隔が0msecとなってReloadが多発してしまいます。

MainActivity.java

public class MainActivity extends AppCompatActivity {
    static String URL = "https://www.yahoo.co.jp/";
    private WebView myWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myWebView = (WebView) findViewById(R.id.webview);

        myWebView.setWebViewClient(new MyWebViewClient());
        myWebView.setWebChromeClient(new WebChromeClient());
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.getSettings().setAppCacheEnabled(true);
        myWebView.getSettings().setBuiltInZoomControls(true);
        myWebView.getSettings().setSaveFormData(true);
        myWebView.loadUrl(URL);

        //X分毎にReloadを実行する。
        final Handler handler = new Handler();
        final Runnable r = new Runnable() {

            @Override
            public void run() {

                if (PreferenceManager1.getPref_reload_switch(getApplicationContext())) { //
                    int interval1 = PreferenceManager1.getPref_reload_interval(getApplicationContext());
                    myWebView.reload(); // リロードをする
                    handler.postDelayed(this, (interval1 * 60000));
                }
            }
        };
        handler.post(r);
        //X分毎にReloadを実行する。^^//
    }
    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    }

    @Override
    public void onBackPressed() {
        if (myWebView != null && myWebView.canGoBack())
            myWebView.goBack();// if there is previous page open it
        else
            super.onBackPressed();//if there is no previous page, close app
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent e) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (myWebView != null && myWebView.canGoBack()) {
                myWebView.goBack();
            }
            return true;
        } else {
            return super.onKeyDown(keyCode, e);
        }
    }

    // [次の画面を表示]ボタンがタップされたときの処理。
    public void onButtonClick(View view) {
        // インテントオブジェクトを用意。
        Intent intent = new Intent(MainActivity.this, MySettingsActivity.class);
        // アクティビティを起動。
        startActivity(intent);
    }
}

MySettingActivity.java

public class MySettingsActivity extends AppCompatActivity {

    private LayoutInflater mLayoutInflater;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_my_settings);

        TextView system_reload = (TextView) findViewById(R.id.id_Reload);
        Switch reload_switch = (Switch) findViewById(R.id.id_reload_switch);

        reload_switch.setChecked(PreferenceManager1.getPref_reload_switch(getApplicationContext()));
        if(PreferenceManager1.getPref_reload_switch(getApplicationContext())) {
            system_reload.setEnabled(true);
        }
        else{
            system_reload.setEnabled(false);
        }

        system_reload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showInputDialog();
            }
        });

        reload_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked == true) {
                    reload_switch.setChecked(true);
                    system_reload.setEnabled(true);
                } else {
                    reload_switch.setChecked(false);
                    system_reload.setEnabled(false);
                }
                PreferenceManager1.setPref_reload_switch(getApplicationContext(), isChecked);
            }
        });
    }

    // [前の画面を表示]ボタンがタップされたときの処理。
    public void onButtonClick(View view){
        //このアクティビティの終了。
        finish();
    }

    int interval1;

    private void showInputDialog() {

        mLayoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View dialogView = mLayoutInflater.inflate( R.layout.input_dialog, null );
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setView(dialogView)
                .show();

        EditText et_refresh_interval = dialogView.findViewById(R.id.et_refresh_interval);
        Button btn_set = dialogView.findViewById(R.id.btn_set);

        btn_set.setOnClickListener(view -> {
            PreferenceManager1.setPref_reload_interval(getApplicationContext(),interval1);;
            interval1 = Integer.parseInt(et_refresh_interval.getText().toString());

            if (interval1 > 60) {
                interval1 = 60;
            } else if (interval1 < 1) {
                interval1 = 1;
            }
            dialog.dismiss();
        });

    } // showInputDialog

}

PreferenceManager1.java

public class PreferenceManager1 {

    public static final String PREFERENCES_NAME = "rebuild_preference";

    private static SharedPreferences getPreferences(Context context) {
        return context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
    }

    public static boolean getPref_reload_switch(Context context) {
        SharedPreferences prefs = getPreferences(context);
        boolean value = prefs.getBoolean("reset_save", true);
        return value;
    }

    public static void setPref_reload_switch(Context context, boolean value) {
        SharedPreferences prefs = getPreferences(context);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putBoolean("reset_save", value);
        editor.commit();
    }

    public static void setPref_reload_interval(Context context, int value) {
        SharedPreferences prefs = getPreferences(context);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString("reset_minutes", Integer.toString(value));
        editor.commit();
    }

    public static int getPref_reload_interval(Context context) {
        SharedPreferences prefs = getPreferences(context);
        String value = prefs.getString("reset_minutes", "1");
        return Integer.parseInt(value);
    }


}

activity_main.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <RelativeLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_gravity="center|bottom"
        android:layout_height="match_parent"
        tools:ignore="MissingConstraints">

        <WebView
            android:id="@+id/webview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >
        </WebView>

        <Button
            android:id="@+id/btNext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onButtonClick"
            android:text="リロードセッティング"/>

    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

activity_my_setting.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:gravity="center_horizontal">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="left">
        <TextView
            android:id="@+id/back"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="?attr/selectableItemBackgroundBorderless"
            android:padding="10dp"
            android:onClick="onButtonClick"
            android:text="戻る"
            android:textSize="25dp"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="left">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:textSize="20dp"
            android:text="リロードセッティング"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="50dp"
            android:gravity="center"
            android:textSize="20dp"
            android:textStyle="bold"
            android:text="リロード"/>
        <View
            android:layout_width="0dp"
            android:layout_height="60dp"
            android:layout_weight="1" />
        <Switch
            android:id="@+id/id_reload_switch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleX="1.5"
            android:scaleY="1.5"
            android:layout_marginRight="10dp"
            android:layout_gravity="right|center"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="center"
                android:textSize="20dp"
                android:textStyle="bold"
                android:text="間隔設定"/>

            <View
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_weight="1" />

            <TextView
                android:id="@+id/id_Reload"
                android:layout_width="250dp"
                android:layout_height="60dp"
                android:background="@color/tfe_color_accent"
                android:gravity="center"
                android:text="間隔設定"
                android:textColor="@color/colorWhite"
                android:textSize="15dp"
                android:layout_gravity="right|center"/>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

input_dialog.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="更新間隔 入力"
            android:textSize="30sp"
            android:textStyle="bold"
            />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center">


            <EditText
                android:id="@+id/et_refresh_interval"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="1~60"
                android:textSize="30sp"
                android:inputType="number"
                android:digits="0123456789"
                android:maxLength="2"
                android:minLines="1"
                android:layout_gravity="center_vertical"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="分"
                android:textSize="20sp" />
            <View
                android:layout_width="20dp"
                android:layout_height="80dp"/>
            <Button
                android:id="@+id/btn_set"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Set"
                android:layout_gravity="right|center_vertical"
                />
        </LinearLayout>

    </LinearLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
0

2Answer

btn_set.setOnClickListener(view -> {
    PreferenceManager1.setPref_reload_interval(getApplicationContext(),interval1);;
    interval1 = Integer.parseInt(et_refresh_interval.getText().toString());

    ...
});

保存する前に入力された値を取得する必要があるのではないでしょうか。

0Like

Your answer might help someone💌