0

私はJavaに非常に不慣れで、最初のAndroidアプリの完成に近づいていました.最悪の恐怖が起こり、解釈方法がわからないエラーに達しました.

アプリの基本は、ドロワー メニューから選択した 5 つのリストです。各リストは、コンテンツを含む静的 XML ビューを開きます。これはすべてポートレートでスムーズに機能します。横向きでは、ビューはデュアルペインで、左側にリスト、右側にコンテンツが表示されます。そこに着くのもうまくいきます。しかし、あるリストでランドスケープに入るとエラーが発生し、後で別のリストでランドスケープに移動しようとします。誰かが何が起こっているのかを理解するのを手伝ってくれませんか?

主な活動

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

public class MainActivity extends SherlockFragmentActivity {

    Fragment rotcfraglist = new RotcFragList();
    Fragment afafraglist = new AfaFragList();
    Fragment bmtfraglist = new BmtFragList();
    Fragment docsfraglist = new DocsFragList();
    Fragment extrafraglist = new ExtraFragList();

.... *drawer set up stuff ....

// ListView click listener in the navigation drawer
    private class DrawerItemClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            selectItem(position);
        }
    }

    private void selectItem(int position) {

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

        View fullFrame = findViewById(R.id.full_frame);
        View detailsFrame = findViewById(R.id.details);
        View listFrame = findViewById(R.id.list_frame);

        // Destroy Backstack first
        fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

        // Locate Position
        switch (position) {
        ///ROTC
        case 0:
            ft.remove(docsfraglist);
            ft.remove(extrafraglist);

            if (fullFrame != null && fullFrame.getVisibility() == View.VISIBLE) {
                fullFrame.setVisibility(View.GONE);
            }
            if (detailsFrame != null
                    && detailsFrame.getVisibility() == View.GONE) {
                detailsFrame.setVisibility(View.VISIBLE);
            }
            if (listFrame != null && listFrame.getVisibility() == View.GONE) {
                listFrame.setVisibility(View.VISIBLE);
            }

        ft.replace(R.id.list_frame, rotcfraglist);
            break;
        ///AFA
        case 1:
            ft.remove(docsfraglist);
            ft.remove(extrafraglist);

            if (fullFrame != null && fullFrame.getVisibility() == View.VISIBLE) {
                fullFrame.setVisibility(View.GONE);
            }
            if (detailsFrame != null
                    && detailsFrame.getVisibility() == View.GONE) {
                detailsFrame.setVisibility(View.VISIBLE);
            }
            if (listFrame != null && listFrame.getVisibility() == View.GONE) {
                listFrame.setVisibility(View.VISIBLE);
            }

            ft.replace(R.id.list_frame, afafraglist);
            break;
        ///BMT
        case 2:
            ft.remove(docsfraglist);
            ft.remove(extrafraglist);

            if (fullFrame != null && fullFrame.getVisibility() == View.VISIBLE) {
                fullFrame.setVisibility(View.GONE);
            }
            if (detailsFrame != null
                    && detailsFrame.getVisibility() == View.GONE) {
                detailsFrame.setVisibility(View.VISIBLE);
            }
            if (listFrame != null && listFrame.getVisibility() == View.GONE) {
                listFrame.setVisibility(View.VISIBLE);
            }

            ft.replace(R.id.list_frame, bmtfraglist);
            break;
        ///Docs
        case 3:
            ft.remove(rotcfraglist);
            ft.remove(afafraglist);
            ft.remove(bmtfraglist);

            if (detailsFrame != null
                    && detailsFrame.getVisibility() == View.VISIBLE) {
                detailsFrame.setVisibility(View.GONE);
            }
            if (fullFrame != null && fullFrame.getVisibility() == View.GONE) {
                fullFrame.setVisibility(View.VISIBLE);
            }
            if (listFrame != null && listFrame.getVisibility() == View.VISIBLE) {
                listFrame.setVisibility(View.GONE);
            }

            ft.replace(R.id.full_frame, docsfraglist);
            break;
        ///Extra
        case 4:
            ft.remove(rotcfraglist);
            ft.remove(afafraglist);
            ft.remove(bmtfraglist);

            if (detailsFrame != null
                    && detailsFrame.getVisibility() == View.VISIBLE) {
                detailsFrame.setVisibility(View.GONE);
            }
            if (fullFrame != null && fullFrame.getVisibility() == View.GONE) {
                fullFrame.setVisibility(View.VISIBLE);
            }
            if (listFrame != null && listFrame.getVisibility() == View.VISIBLE) {
                listFrame.setVisibility(View.GONE);
            }

            ft.replace(R.id.full_frame, extrafraglist);
            break;
        }
        ft.commit();
        mDrawerList.setItemChecked(position, true);

        // Get the title followed by the position
        setTitle(title[position]);
        // Close drawer
        mDrawerLayout.closeDrawer(mDrawerList);
    }

リストフラグメントの 1 つ

import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.app.SherlockListFragment;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class BmtFragList extends SherlockListFragment {

boolean mDualPane;
static int mCurCheckPosition = 0;
public final String [] TITLES = {
    "Core Values",
    "AF Mission",
    "Airman's Creed",
    "Air Force Song",
    "Ranks AF Enlisted",
    "Ranks AF Officer",
    "Chain of Command",
    "Reporting Statement",
    "Phonetic Alphabet"
};

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    setListAdapter(new ArrayAdapter<String>(getActivity(),
            R.layout.simple_list_item_checkable_1, android.R.id.text1, TITLES));

    // Check landscape or not
    View detailsFrame = getActivity().findViewById(R.id.details);
    mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;

    getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);

    if (savedInstanceState != null) {
        mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
        showDetails(mCurCheckPosition);
    }

    if (mDualPane) {
        showDetails(mCurCheckPosition);
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putInt("curChoice", mCurCheckPosition);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    showDetails(position);
}

// If landscape, replace details. If not, replace list.
void showDetails(int position) {

    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    mCurCheckPosition = position;

    if (mDualPane) {
        getListView().setItemChecked(position, true);

        BmtDetailsFragment details = (BmtDetailsFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.details);

        if (details == null || details.getShownIndex() != position) {
            details = BmtDetailsFragment.newInstance(position);
            ft.replace(R.id.details, details);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();
        }
    } else {
        getListView().setItemChecked(position, true);

        Intent intent = new Intent();
        intent.setClass(getActivity(), DetailsActivity.class);
        intent.putExtra("position", position);
        startActivity(intent);
    }
}

public static class DetailsActivity extends SherlockFragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        setTheme(MainActivity.getThemeId());

        super.onCreate(savedInstanceState);

        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            finish();
            return;
        }
        if (savedInstanceState == null) {
            BmtDetailsFragment details = new BmtDetailsFragment();
            details.setArguments(getIntent().getExtras());
            getSupportFragmentManager().beginTransaction().add(android.R.id.content, details).commit();
        }
    }
}

public static class BmtDetailsFragment extends SherlockFragment {

    public static BmtDetailsFragment newInstance(int position) {
        BmtDetailsFragment f = new BmtDetailsFragment();

        // Make index input an argument
        Bundle args = new Bundle();
        args.putInt("position", position);
        f.setArguments(args);

        return f;
    }

    public int getShownIndex() {
        return getArguments().getInt("position", 0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        if (container == null) {
        return null;
        }

        View newContent = getView();
        int position = getShownIndex();

        switch (position) {
        case 0:
            newContent = inflater.inflate(R.layout.corevalues, container, false);
            break;
        case 1:
            newContent = inflater.inflate(R.layout.afmission, container, false);
            break;
        case 2:
            newContent = inflater.inflate(R.layout.airmanscreed, container, false);
            break;

    ....more cases.....

        }
        return newContent;
    }
}
}

メイン アクティビティ ランドスケープ レイアウト

<android.support.v4.widget.DrawerLayout     xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<FrameLayout
    android:id="@+id/full_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/list_frame"
        android:layout_width="180dp"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/details"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/list_frame" >
    </FrameLayout>
</RelativeLayout>

<ListView
    android:id="@+id/listview_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#262626"
    android:choiceMode="singleChoice"
    android:divider="#5C5C5C"
    android:dividerHeight="1dp" />

</android.support.v4.widget.DrawerLayout>

LogCat

ここに画像の説明を入力

コードの壁で申し訳ありませんが、ここで本当に迷っています。エラーは、そのフレームの内容を設定する責任がある各クラスの DetailsActivity を指しているため、リストの横にある detailsframe と関係があると思います。新しい詳細を含む新しいリストを同じ場所にロードする前に、フレームをクリアする必要があるのでしょうか? しかし、どうすればいいのかわかりません。どんな助けでも大歓迎です!!! 初めてのアプリがこのように崩れるのを見たくありません。考えると気分が悪くなります。

4

1 に答える 1