Android: Background image resize on keyboard pop up

后端 未结 12 926
伪装坚强ぢ
伪装坚强ぢ 2021-02-03 20:01

I am developing an application in which the background image get shrink on keyboard pop-up. My .xml is as follows :



        
相关标签:
12条回答
  • 2021-02-03 20:51

    Check this answer, the basic trick is you don't set the background to the layout but to the window. This can be done from the activity with getWindow().setBackgroundDrawable(), or you can set it in a theme to your activity.

    0 讨论(0)
  • 2021-02-03 20:51

    Instead of android:windowSoftInputMode="stateVisible|adjustPan", you should change to android:windowSoftInputMode="stateVisible|adjustResize". It worked for me.

    0 讨论(0)
  • 2021-02-03 20:55

    I had the same issue.

    Add your outer layout background inside onCreate method as show below

    getWindow().setBackgroundDrawableResource(R.drawable.login_bg);
    

    and add your outer layout as

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    >
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#4d000000"
        ><other code></ScrollView></RelativeLayout>
    

    Add android:layout_weight="1" for the outer layout and don't set background in xml file I think this helps someone

    0 讨论(0)
  • 2021-02-03 20:55

    Use ScrollView as Top parent. It will be scrolled up and down automatically when you open and close keyboard.

    0 讨论(0)
  • 2021-02-03 20:58

    You should move the android:background="@drawable/background" in an ImageView above ScrollView. When the keyboard pops up it effectivly makes the screen smaller, and having an image as background you have no control on how it is resized/cropped. So, assuming you want to have the image full width but keep the ascpect ratio try this:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:facebook="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
        <ImageView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:src="@drawable/background"
            android:scaleType="centerCrop" />
    
        <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
            <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" >           
                /**
                Other stuff
                */
            </RelativeLayout>
        </ScrollView>
    </RelativeLayout>
    

    You can try different android:scaleType values to achive your desired effect. If you want the image to be cropped from the top instead of the default middle crop, see here on how to achieve this, or try using this library

    0 讨论(0)
  • 2021-02-03 21:01

    Ok if I got your question right, you want a layout with a background and a scrollview. And when the softkeyboard pops up, you want to resize the scrollview, but keep the background at full size right? if that's what you want than I may have found a workaround for this issue:

    What you can do is make 2 activities.

    Activity 1:

    public class StartActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        Intent StartApp = new Intent(this, DialogActivity.class);
        startActivity(StartApp);         // Launch your official (dialog) Activity
    
        setContentView(R.layout.start);  // your layout with only the background 
        }
    }
    

    Activity2:

    public class DialogActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);  // get rid of dimming
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);  //get rid of title bar (if you want)
    
        setContentView(R.layout.dialog);  //Dialog Layout with scrollview and stuff
    
        Drawable d = new ColorDrawable(Color.BLACK);  //make dialog transparent
        d.setAlpha(0);
        getWindow().setBackgroundDrawable(d);
        }
    }
    

    start layout:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/test">  //your background
    </LinearLayout>
    

    dialog layout:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent">
    
        <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
    
                <LinearLayout
                    android:orientation="vertical"     
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
    
                    <!-- All your Scrollview Items -->
    
                </LinearLayout>
         </ScrollView>
    </RelativeLayout>
    

    AndroidManifest.xml

    start Activity:

    android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
    

    dialog Activity

    android:theme="@android:style/Theme.Dialog"
    android:windowSoftInputMode="adjustResize"
    android:excludeFromRecents="true"
    

    Edit: To finish Activities at once use the following somewhere inside your DialogActivity (example: override the backbutton):

    @Override
    public void onBackPressed() {
        Intent intent = new Intent(getApplicationContext(), StartActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("EXIT", true);
        startActivity(intent);
    }
    

    and in onCreate() of StartActivity:

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
    }
    else {
        Intent StartApp = new Intent(this, TestActivity.class);
        startActivity(StartApp);
    }
    

    Screenshots!

    Normal Normal

    Clicked the EditText box Clicked textbox

    After Scrolled down (ps: i put textbox inside scrollview thats why its gone ;) ) after scrolled down

    I hope this will help your out ;)

    0 讨论(0)
提交回复
热议问题