In meiner Anwendung habe ich diesen Code, um die Telefongröße zu berechnen und den RecyclerView Layout-Manager in GridLayoutManager oder LinearLayoutManager zu ändern

private void changeFeedsLayout() {
    // Choose between one, two or three elements per row
    if (dpWidth > 720 && getResources().getConfiguration().orientation ==
            ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
        instagram_feeds.setLayoutManager(new GridLayoutManager(
                context, 3, LinearLayoutManager.VERTICAL, false));
    } else if (dpWidth > 520) {
        instagram_feeds.setLayoutManager(new GridLayoutManager(
                context, 2, LinearLayoutManager.VERTICAL, false));
    } else {
        instagram_feeds.setLayoutManager(new LinearLayoutManager(
                context, LinearLayoutManager.VERTICAL, false));
    }
}

Dieser Code funktioniert einwandfrei, wenn ich jedes Fragment an einen Container auf MainActivity anhänge oder festschreibe, aber er funktioniert nicht, wenn ich die Ausrichtung des Telefons ändere. Um dieses Problem zu beheben, verwende ich diesen Code:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    changeFeedsLayout();
}

Und leider ist der Layoutmanager von RecyclerView immer LinearLayoutManager und ich kann das nicht lösen. Nach dem Einschalten eines anderen Fragments und zurück zum vorherigen Fragment funktioniert dies einwandfrei.

UPDATE

Bei Änderung der Telefonausrichtung lautet dieser Code wie folgt:

instagram_feeds.setLayoutManager(new LinearLayoutManager(
                    context, LinearLayoutManager.VERTICAL, false));

Arbeiten Sie nicht an der Änderung der Telefonausrichtung mit der Methode changeFeedsLayout(), und diese Methode konnte die Telefongröße beim Ändern der Telefonausrichtung nicht korrekt berechnen

5
DolDurma 19 Jän. 2019 im 13:31

3 Antworten

Beste Antwort

Dies mag seltsam klingen, aber die einzig gültige Lösung für diesen Fall besteht darin, diese Einstellungen in Ressourcen zu übernehmen. Android OS nimmt Ressourcen auf, die auf vielen Eigenschaften basieren, und eine davon ist die kleinste Breite. So trennen Sie die Liste vom Raster: values / bools.xml :

<resources>
    <bool name="is_grid">false</bool>
</resources>

Der andere ist values-sw520dp / bools.xml :

<resources>
    <bool name="is_grid">true</bool>
</resources>

Für die Anzahl der Spalten dieselbe Logik values-sw520dp / integers.xml :

<resources>
    <integer name="grid_column_count">2</integer>
</resources>

Und values-sw720dp / integers.xml :

<resources>
    <integer name="grid_column_count">3</integer>
</resources>

Im Code ist dies also ungefähr so:

if (getResources().getBoolean(R.bool.is_grid)) {
    instagram_feeds.setLayoutManager(new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.grid_column_count));
} else {
    instagram_feeds.setLayoutManager(new LinearLayoutManager(getActivity());
}

Dies sollte angewendet werden, wenn Sie Ihre Ansicht erstellen, ohne Konfigurationsänderungen vornehmen zu müssen - dies ist bereits für Sie erledigt. Geben Sie dem Betriebssystem seine Arbeit.

3
Viktor Yakunin 3 Feb. 2019 im 22:11

GridLayoutManager.LayoutParams werden in den Kommentaren erklärt:

if the orientation is VERTICAL, the width parameter is ignored and

if the orientation is HORIZONTAL, the height parameter is ignored

because child view is expected to fill all of the space given to it.

Der Punkt ist:

Dass ein LinearLayoutManager immer eine einzelne Spalte hat;

Während ein GridLayoutManager "kann" 1 (oder mehr) Spalte (n) haben.

1
Martin Zeitler 5 Feb. 2019 im 01:09

Um mit der Änderung der Ausrichtung fertig zu werden und entsprechend zu arbeiten, habe ich Folgendes getan:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Log.i("SCREEN DP","Orientation:"+ getResources().getConfiguration().orientation +" Width = "+getWidthDp());
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i("SCREEN DP","Orientation:"+ newConfig.orientation +" Width = "+getWidthDp());
    }

    public float getWidthDp(){
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        return displayMetrics.widthPixels / displayMetrics.density;
    }
}

Die Protokolle zeigen:

I/SCREEN DP: Orientation:1 Width = 411.42856
I/SCREEN DP: Orientation:2 Width = 683.4286
I/SCREEN DP: Orientation:1 Width = 411.42856
I/SCREEN DP: Orientation:2 Width = 683.4286

Vergessen Sie nicht, android:screenOrientation="fullSensor" zum Manifest hinzuzufügen, um alle Ausrichtungen verarbeiten zu können.

0
113408 3 Feb. 2019 im 21:38