タブの使用中に新しいXMLレイアウトを設定するにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/5345525

  •  27-10-2019
  •  | 
  •  

質問

複数のアクティビティを備えたタブ付きインターフェイスを作成しようとしています。タブの一部として、次のようなXML Tabhostファイルを作成して設定しました。

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:padding="5dp" />
    </LinearLayout>
</TabHost>

これは私のtabs.classファイルで呼び出されます。

package com.system.kenetix;

import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TabHost;

public class Tabs extends TabActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tabs);

        Resources res = getResources(); // Resource object to get Drawables
        TabHost tabHost = getTabHost();  // The activity TabHost
        TabHost.TabSpec spec;  // Resusable TabSpec for each tab
        Intent intent;  // Reusable Intent for each tab

        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, Availability.class);
        // Initialize a TabSpec for each tab and add it to the TabHost
        spec = tabHost.newTabSpec("Availability").setIndicator("Booking",
                res.getDrawable(R.drawable.kenetix_tab_available))
            .setContent(intent);
        tabHost.addTab(spec);

        // Do the same for the other tabs
        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, RoomsAvailable.class);
        spec = tabHost.newTabSpec("Room").setIndicator("Rooms",
                          res.getDrawable(R.drawable.kinetix_tab_rooms))
                      .setContent(intent);
        tabHost.addTab(spec);

        // Do the same for the other tabs
        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, CustomerDetails.class);
        spec = tabHost.newTabSpec("Customer").setIndicator("Customer",
                          res.getDrawable(R.drawable.kinetix_tab_customer))
                      .setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, Payment.class);
        spec = tabHost.newTabSpec("Payment").setIndicator("Payment",
                          res.getDrawable(R.drawable.kinetix_tab_payment))
                      .setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, Extras.class);
        spec = tabHost.newTabSpec("Extras").setIndicator("Extras",
                          res.getDrawable(R.drawable.kinetix_tab_extras))
                      .setContent(intent);
        tabHost.addTab(spec);

        tabHost.setCurrentTab(0);
    }
}

次に、タブごとに個別のクラスとXMLファイルがあり、コンテンツ(ボタン、スピナーなど)を設定します。

package com.system.kenetix;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;

public class Availability extends Activity {
    /** Called when the activity is first created. */
    Intent intent = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.availability);

    /*Nights Spinner*/

    //Create an instance of the Number of Nights spinner
    Spinner NumNightsSpinner = (Spinner) findViewById(R.id.NumAdultsSpinner);

    //Create an ArrayAdapter for the Number of Nights spinner
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.NumNights_array, android.R.layout.simple_spinner_item);

    //Set the adapter layout
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    //Apply the adapter layout to the Number of Nights spinner
    NumNightsSpinner.setAdapter(adapter);
    NumNightsSpinner.setOnItemSelectedListener(new MyOnNumNightsSelectedListener());

    /*Adults Spinner*/

    //Create an instance of the Number of Adults spinner
    Spinner NumAdultsSpinner = (Spinner) findViewById(R.id.NumAdultsSpinner);

    //Create an ArrayAdapter for the Number of adults spinner
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(this, R.array.NumAdults_array, android.R.layout.simple_spinner_item);

    //Set the adapter layout
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    //Apply the adapter layout to the Number of Adults spinner
    NumAdultsSpinner.setAdapter(adapter);
    NumAdultsSpinner.setOnItemSelectedListener(new MyOnNumAdultsSelectedListener());

    /*Children Spinner*/

    //Create an instance of the Number of Children spinner
    Spinner NumChildSpinner = (Spinner) findViewById(R.id.NumChildSpinner);

    //Create an ArrayAdapter for the Number of Children spinner
    ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(this, R.array.NumChild_array, android.R.layout.simple_spinner_item);

    //Set the adapter layout
    adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    //Apply the adapter layout to the Number of Children spinner
    NumChildSpinner.setAdapter(adapter);
    NumChildSpinner.setOnItemSelectedListener(new MyOnNumChildSelectedListener());

    Button CheckAvailable = (Button) findViewById(R.id.CheckAvailabilityBtn);
    CheckAvailable.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // TODO Auto-generated method stub
            intent = new Intent(v.getContext(), RoomsAvailable.class);
            startActivity(intent);
        }
    });
}

//Listener for the selected item from the number of nights spinner
public class MyOnNumNightsSelectedListener implements OnItemSelectedListener {
    public void onItemSelected(AdapterView<?> parent,View view, int pos, long id){

        //If no number of nights has been selected or onCreate occurs cancel the toast
        if (parent.getItemAtPosition(pos).toString().equals("0")){
            Toast.makeText(parent.getContext(), "You selected " + parent.getItemAtPosition(pos).toString() + " night(s)", Toast.LENGTH_LONG).cancel();
        }

        //Else create a toast stating the number of nights selected
        else{
        Toast.makeText(parent.getContext(), "You selected " + parent.getItemAtPosition(pos).toString() + " night(s)", Toast.LENGTH_LONG).show();
        }
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // TODO Auto-generated method stub

    }

}
//Listener for the selected item from the number of adults spinner
public class MyOnNumAdultsSelectedListener implements OnItemSelectedListener {
    public void onItemSelected(AdapterView<?> parent,View view, int pos, long id){

        //If no number of nights has been selected or onCreate occurs cancel the toast
        if (parent.getItemAtPosition(pos).toString().equals("0")){
            Toast.makeText(parent.getContext(), "You selected " + parent.getItemAtPosition(pos).toString() + " adults", Toast.LENGTH_LONG).cancel();
        }

        else if (parent.getItemAtPosition(pos).toString().equals("1")){
            Toast.makeText(parent.getContext(), "You selected " + parent.getItemAtPosition(pos).toString() + " adult", Toast.LENGTH_LONG).cancel();
        }

        //Else create a toast stating the number of nights selected
        else{
        Toast.makeText(parent.getContext(), "You selected " + parent.getItemAtPosition(pos).toString() + " adult(s)", Toast.LENGTH_LONG).show();
        }
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // TODO Auto-generated method stub
        //Do Nothing
    }
}
//Listener for the selected item from the number of adults spinner
public class MyOnNumChildSelectedListener implements OnItemSelectedListener {
    public void onItemSelected(AdapterView<?> parent,View view, int pos, long id){

        //If no number of nights has been selected or onCreate occurs cancel the toast
        if (parent.getItemAtPosition(pos).toString().equals("0")){
            Toast.makeText(parent.getContext(), "You selected " + parent.getItemAtPosition(pos).toString() + " children", Toast.LENGTH_LONG).cancel();
        }
        else if (parent.getItemAtPosition(pos).toString().equals("1")){
            Toast.makeText(parent.getContext(), "You selected " + parent.getItemAtPosition(pos).toString() + " child", Toast.LENGTH_LONG).show();
        }

        //Else create a toast stating the number of nights selected
        else{
        Toast.makeText(parent.getContext(), "You selected " + parent.getItemAtPosition(pos).toString() + " children", Toast.LENGTH_LONG).show();
        }
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // TODO Auto-generated method stub
        //Do Nothing
    }
}

}

そして、これに合うXML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout1" android:background="@color/custom_theme_color"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:baselineAligned="false" android:orientation="vertical">
    <TableLayout android:layout_width="wrap_content"
        android:layout_alignParentLeft="true" android:layout_height="wrap_content"
        android:id="@+id/tableLayout1" android:stretchColumns="1"
        android:layout_weight="1">

        <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <ImageButton android:src="@drawable/icon"
                android:layout_height="wrap_content" android:layout_width="wrap_content"
                android:id="@+id/QuickRoomSelect" android:layout_weight="1" />
            <ImageButton android:src="@drawable/icon"
                android:layout_height="wrap_content" android:layout_width="wrap_content"
                android:id="@+id/QuickCustomerDetails" android:layout_weight="1" />
            <ImageButton android:src="@drawable/icon"
                android:layout_height="wrap_content" android:layout_width="wrap_content"
                android:id="@+id/imageButton1" android:layout_weight="1" />
        </TableRow>
    </TableLayout>

    <TextView android:layout_width="match_parent"
        android:textColor="@color/custom_theme_text_color" android:id="@+id/availabilityLbl"
        android:text="@string/AvailableLbl" android:layout_height="wrap_content"
        android:layout_weight="1" />

    <Button android:layout_height="wrap_content" android:id="@+id/DateFromBtn"
        android:layout_width="match_parent" android:text="@string/DateFromBtn"
        android:layout_weight="1" />
    <TextView android:textColor="@color/custom_theme_text_color"
        android:layout_height="wrap_content" android:id="@+id/NumNightsLdl"
        android:text="@string/NumNightsLbl" android:layout_width="wrap_content"
        android:layout_weight="1"></TextView>
    <Spinner android:layout_height="wrap_content" android:id="@+id/NumAdultsSpinner"
        android:layout_width="wrap_content" android:layout_weight="1"></Spinner>

    <TableLayout android:layout_height="wrap_content"
        android:id="@+id/tableLayout2" android:layout_width="match_parent"
        android:layout_weight="1">
        <TableRow android:id="@+id/tableRow3" android:layout_height="wrap_content"
            android:layout_width="match_parent" android:layout_weight="1">
            <TextView android:textColor="@color/custom_theme_text_color"
                android:layout_height="wrap_content" android:id="@+id/NumAdultsLbl"
                android:text="@string/NumAdultsLbl" android:layout_weight="2"></TextView>
            <TextView android:textColor="@color/custom_theme_text_color"
                android:layout_height="wrap_content" android:id="@+id/NumChildLbl"
                android:layout_weight="2" android:text="@string/NumChildLbl"></TextView>
        </TableRow>
        <TableRow android:id="@+id/tableRow2" android:layout_width="match_parent"
            android:layout_height="wrap_content" android:layout_weight="1">
            <Spinner android:layout_height="wrap_content" android:id="@+id/NumNightsSpinner"
                android:layout_width="wrap_content" android:layout_weight="1"></Spinner>
            <Spinner android:layout_height="wrap_content" android:id="@+id/NumChildSpinner"
                android:layout_width="wrap_content" android:layout_weight="1"></Spinner>
        </TableRow>
    </TableLayout>

    <Button android:layout_width="match_parent" android:id="@+id/CheckAvailabilityBtn"
        android:layout_height="wrap_content" android:text="@string/CheckAvailableBtn"
        android:layout_weight="1" />

</LinearLayout>

基本的に私が知っておくべきことは、どうすれば Availability.class 2番目のXMLファイルを使用するファイル? 私が見ることができるのは、見栄えが良いタブだけです! 可能な限りOOになろうとしているので、メインコードでボタンなどを作成する必要はありません。 私が見たすべての例は、tab.xmlを使用して、すべてのタブに同じ情報を持っている場合に最適なアクティビティをレイアウトするか、レイアウトのものがJavaクラスに直接書き込まれます。

私がやりたいことをすることは可能ですか?もしそうなら、誰かがこれを行う方法について私にアドバイスしたり、どこかに私をリンクしたりすることができますか?

役に立ちましたか?

解決

あなたが望むのは、基本的に私のアプリケーションの編成方法です(2番目のバージョンでは、代わりにビューベースです)。

ただし、Tabs XMLファイルには少し問題があるようです。

1)なぜXMLN:Androidタグを2回持っているのですか? TabhostとLinearLayoutの両方がそれを持っています - LinearLayoutからそれを削除します。

2)linearlayoutのmatch_parentレイアウトパラメーションについてはわかりません(これは問題ではない可能性があります) - 私の最初のtabhost(後で少し改訂)はこのように見えました。 Android docs;))、そしてうまく機能しました:

<TabHost android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent">
   <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
      <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
      <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
   </LinearLayout>
</TabHost>

最初のものを修正してみてください。それは正常に動作するはずです。そうすべきではない理由はありません。

他のヒント

私は自分の問題を解決しました。基本的に、何が起こったのか分かりませんが、構成内の何かが破損しているに違いありません。私は新しいプロジェクトを作成し、コードをコピーして貼り付けましたが、すべて正常に機能しています。確かに非常に奇妙です。クラウスに助けてくれてありがとう、それはあなたが指摘したものが私が犯した間違いだったので助けをしました。

また、bubbubbly

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top